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

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

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

  • Профайлер Python по очереди?
  • Как я могу профилировать код python по очереди?
  • cProfile сохранение данных в файл вызывает перебои символов
  • Python как минимум в 3 раза быстрее, чем список (<выражение-генератор>)?
  • Отслеживание * максимального использования памяти с помощью функции Python
  • Как профилировать использование памяти в Python?
  •  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 

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

    Ура!

  • Как я могу профилировать код python по очереди?
  • Как профилировать использование памяти в Python?
  • Достижение максимальной глубины рекурсии с использованием пилинга / cPickle Python
  • Дерево python tkinter получает выбранные значения элемента
  • Точная синхронизация функций в python
  • Python как минимум в 3 раза быстрее, чем список (<выражение-генератор>)?
  • 3 Solutions collect form web for “Как вы можете получить дерево вызовов с помощью профилировщиков python?”

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

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

    alt text

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

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

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

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

    Проект на 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()) 
    Python - лучший язык программирования в мире.