Как получить дерево вызовов с помощью профилировщиков Python?

Я использовал хороший профилировщик Apple, встроенный в приложение System Monitor. Пока ваш код C ++ был скомпилирован с отладочной информацией, вы могли бы попробовать свое работающее приложение, и оно распечатало бы дерево с отступом, сообщающее вам, какой процент времени родительской функции был потрачен на эту функцию (а также на вызовы тела и других функций) .

Например, если main вызывает function_1 и function_2 , function_2 вызывает function_3 , а затем основные вызовы function_3 :

main (100%, 1% in function body):
    function_1 (9%, 9% in function body):
    function_2 (90%, 85% in function body):
        function_3 (100%, 100% in function body)
    function_3 (1%, 1% in function body)

Я бы увидел это и подумал: «Что-то занимает много времени в коде в теле function_2 . Если я хочу, чтобы моя программа будь быстрее, вот с чего мне следует начать ».

Как мне легче всего получить этот точный результат профилирования для программы Python?

Я видел, как люди говорят:

import cProfile, pstats
prof = cProfile.Profile()
prof = prof.runctx("real_main(argv)", globals(), locals())
stats = pstats.Stats(prof)
stats.sort_stats("time")  # Or cumulative
stats.print_stats(80)  # 80 = how many to print

Но это довольно беспорядочно по сравнению с это элегантное дерево вызовов. Пожалуйста, дайте мне знать, если вы легко это сделаете, это немного поможет.

27
задан Peter Mortensen 18 August 2018 в 13:11
поделиться