Как получить дерево вызовов с помощью профилировщиков Python?
Раньше я использовал хороший профилировщик Apple, который встроен в приложение System Monitor. Пока ваш код C++ был скомпилирован с отладочной информацией, вы могли бы сэмплировать ваше работающее приложение, и оно распечатало бы дерево с отступами, сообщающее вам, какой процент времени родительской функции был потрачен на эту функцию (и тело по сравнению с вызовами других функций),
Например, если основной называется 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
Но это довольно грязно по сравнению с этим элегантным деревом вызовов. Пожалуйста, дайте мне знать, если вы можете легко это сделать, это очень поможет.
5 ответов
Проверьте эту библиотеку http://pycallgraph.slowchop.com/ для графов вызовов. Это работает очень хорошо. Если вы хотите профилировать определенные функции, ознакомьтесь с http://mg.pov.lt/blog/profiling.html
Это результат модуля profilehooks.
Я просто наткнулся на это и потратил некоторое время на изучение того, как генерировать граф вызовов (обычные результаты cProfile не очень информативны). В будущем мы рассмотрим еще один способ создания красивой графики дерева вызовов с помощью cProfile + gprof2dot + graphViz.
-------
- Установите GraphViz: http://www.graphviz.org/Download_macos.php
easy_install gprof2dot
Запустите профиль по коду.
python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ...
Запустите gprof2dot, чтобы преобразовать профиль вызова в точечный файл.
gprof2dot -f pstats myLog.profile -o callingGraph.dot
Откройте с GraphViz, чтобы визуализировать график
Вот как будет выглядеть конечный результат! График имеет цветовую маркировку - красный означает более высокую концентрацию времени.
Недавно я хотел то же самое, поэтому я попытался реализовать его самостоятельно.
Проект находится на GitHub, https://github.com/joerick/pyinstrument
Вот как вы бы это использовали:
from pyinstrument import Profiler
profiler = Profiler()
profiler.start()
# Code you want to profile
profiler.stop()
print(profiler.output_text())
Вы можете использовать SnakeViz:
pip install snakeviz
Создать файл профиля:
python -m cProfile -o program.prof my_program.py
Создайте интерактивный график:
snakeviz program.prof