Что означает функция ‹цикл 5› в выходных данных cProfile, проанализированных с помощью KchacheGrind?

Я хочу проанализировать производительность кода Python, для этого я использовал модуль cProfile и создал файл .cprof, как указано в документация по Python. Я использую модуль python pyprof2calltree, чтобы открыть файл .cprof в KCacheGrind. Снимок экрана инструмента KCacheGrind. Я приложил скриншот результата анализа, и он показывает, что функция с именем цикл 5 занимает 100,04% процессорного времени. Я не могу понять, что это означает. Также не отображается исходный код этой функции.


person Bhargav Upadhyay    schedule 08.06.2017    source источник


Ответы (1)


он показывает, что функция с именем cycle 5 занимает 100,04% времени процессора.

Нет, это показывает, что некоторый «цикл 5» и все функции, вызываемые из него, и все вызываемые из них функции используют 100% «включительное» время.

<cycle> не являются реальными функциями, это то, как kcachegrind эвристически пытается получить рекурсию информация из формата профилирования ("включительные затраты на звонки внутри цикла не имеют смысла"). Этот формат (определенный для callgrind) не содержит точной информации о последовательностях вызовов функций (f1 вызывает f2 который вызывает f3...), сохраняются только пары caller-callee. Этот формат является точным только для времени «Самостоятельно», но не для «Включительно» (включая время всех вызываемых), когда есть рекурсия.

KCachegrind позволяет (и рекомендует) отключить функцию «Обнаружение цикла» с помощью меню просмотра. : https://kcachegrind.github.io/html/NewsOld.html

Обнаружение цикла переключается с помощью кнопки на панели инструментов. Для приложения с графическим интерфейсом иногда полезно отключить обнаружение циклов, даже если есть ошибки визуализации при рекурсивных вызовах.

Без Cycle Detection никакие синтетические <cycle> функции не будут генерироваться, но некоторые функции могут иметь >100% "Incl." время. Попробуйте использовать «самостоятельное» время или инструменты профилирования с лучшим форматом (linux perf, operf, ocperf.py; cpuprofile google и другие используют форматы профилирования с полными стеками вызовов функций). https://github.com/jrfonseca/gprof2dot перечисляет множество хороших форматов, а также может правильно их визуализировать ( если информации достаточно). Попробуйте это с форматом профиля python:

профиль питона

python -m profile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png

python cProfile (ранее известный как lsprof)

python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png

профилировщик горячих снимков python

Профайлер Hotshot не имеет основной функции. Вместо этого используйте сценарий hotshotmain.py.

 hotshotmain.py -o output.pstats path/to/your/script arg1 arg2
 gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
person osgx    schedule 18.06.2017