Подтвердить что ты не робот

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

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

Например, если 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

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

Ура!

4b9b3361

Ответ 1

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

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

alt text

Ответ 2

Я просто наткнулся на это и потратил некоторое время на изучение создания графика вызовов (обычные результаты 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
    
  • Открыть с помощью графикаViz для визуализации графика

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

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

Ответ 3

Недавно мне захотелось то же самое, так что я сделал удар по его реализации.

Проект на 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())