Profile
- cProfile рекомендуется большинству пользователей; это расширение C
- profile, чистый модуль Python, интерфейс которого имитирует cProfile, но который значительно увеличивает нагрузку на профилируемые программы
Вывод отчетов организован с помощью pstats. Для маленьких объектов кода лучше использовать [timeit]
Запускается через run()
. В данном примере мы получим вывод функции и отчет
import cProfile
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n - 1) + fib(n - 2)
def fib_seq(n):
seq = []
if n > 0:
seq.extend(fib_seq(n - 1))
seq.append(fib(n))
return seq
cProfile.run('print(fib_seq(20)); print()')
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
57358 function calls (68 primitive calls) in 0.009 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.009 0.009 <string>:1(<module>)
57291/21 0.009 0.000 0.009 0.000 profile_fibonacci_raw.py:11(fib)
21/1 0.000 0.000 0.009 0.009 profile_fibonacci_raw.py:22(fib_seq)
1 0.000 0.000 0.009 0.009 {built-in method builtins.exec}
2 0.000 0.000 0.000 0.000 {built-in method builtins.print}
21 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
20 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}
В данном отчете указано сколько всего было вызовов (и сколько примитивов, что указывает на долю рекурсии) и затраченное время. Подробно расписано на что потрачено процессорное время. ncalls - количество вызовов. tottime общее затраченное время. percall время затраченное на вызов (tottime/ncalls). cumtime кумулятивное время, затраченное на функцию и последнее - отноешине кумулятивного времени к количеству примитивных вызовов (cumtime/primitive calls).
Другой вариант запуска прпофилировщика - runctx()
? который позволяет передать простое выражение с параметрами через контекст. Смотри тут
pstats позволяет создавать пользовательский отчет, сохраняя исходные данные профилирования, полученные с run()
или runctx()
. Обработку данных выполняет pstats.Stats
. Смотри тут
С помощью gprof2dot результат работы профилировщика можно визуализировать.
Смотри еще: