В моем исходном коде я пытаюсь захватить и измерить время выпуска сегмента в Python. Как я могу правильно измерить время прохождения этого сегмента с хорошей точностью?
Каков надежный метод поиска наиболее трудоемкой части кода?
Ответ 1
Используйте профайлер.
Python cProfile
включен в стандартную библиотеку.
Для более удобного способа используйте пакет profilestats
. Затем вы можете использовать декоратор, чтобы просто украсить функции, которые хотите профилировать:
from profilestats import profile
@profile
def my_function(args, etc):
pass
Это приведет к тому, что в STDOUT будет напечатано такое краткое изложение:
6 function calls in 0.026 seconds
Ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.026 0.026 some_code.py:3(some_func)
2 0.019 0.010 0.026 0.013 some_code.py:9(expensive_func)
2 0.007 0.003 0.007 0.003 {range}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
Однако гораздо более полезная информация содержится в файле cachegrind.out.profilestats
. Вы можете открыть этот файл с помощью инструментов, которые могут визуализировать статистику cachegrind, например RunSnakeRun и получать приятные, легкие (или более простые) для чтения визуализации вашего стека вызовов следующим образом:
Обновить. Оба запроса на загрузку для profilestats
и pyprof2calltree
были объединены, поэтому теперь они поддерживают Python 3.x.