Как получить дерево вызовов с помощью профилировщиков Python? - PullRequest
24 голосов
/ 28 декабря 2010

Раньше я использовал хороший профилировщик 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

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

Ответы [ 4 ]

49 голосов
/ 19 апреля 2014

Я тоже наткнулся на это и потратил некоторое время на изучение того, как генерировать граф вызовов (обычные результаты cProfile не очень информативны). В будущем мы рассмотрим еще один способ создания красивой графики дерева вызовов с помощью cProfile + gprof2dot + graphViz.

-------

  1. Установить GraphViz: http://www.graphviz.org/Download_macos.php
  2. easy_install gprof2dot
  3. Запустить профиль по коду.

    python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ...
    
  4. Запустите gprof2dot, чтобы преобразовать профиль вызова в точечный файл

    gprof2dot -f pstats myLog.profile -o callingGraph.dot
    
  5. Открыть с помощью GraphViz для визуализации графика

Вот как будет выглядеть конечный результат! График имеет цветовую маркировку - красный означает более высокую концентрацию времени.

Graph is color-coded- red means higher concentration of time

21 голосов
/ 27 марта 2014

Я недавно хотел то же самое, поэтому попытался реализовать его самостоятельно.

Проект находится на 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())
10 голосов
/ 28 декабря 2010

Проверьте эту библиотеку http://pycallgraph.slowchop.com/ для графов вызовов.Это работает очень хорошо.Если вы хотите профилировать определенные функции, проверьте http://mg.pov.lt/blog/profiling.html

Это результат модуля profilehooks.

alt text

0 голосов
/ 27 июня 2018

Подход gprof2dot прекрасно извлекает всю информацию, поэтому я фанат.Однако иногда я хочу посмотреть данные синхронизации в дереве вызовов, поэтому я создал тунец .

enter image description here

Установить с помощью

pip install tuna

и покажите свой профиль с

tuna program.prof

тунцом вдохновлен SnakeViz .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...