Source: Profile

← Rendered

markdown source:

---
description: Cбор и анализ потребления процессорного времени в python
tags: python-standart-library python
title: Profile
---
- cProfile рекомендуется большинству пользователей; это расширение C
- profile, чистый модуль Python, интерфейс которого имитирует cProfile, но который значительно увеличивает нагрузку на профилируемые программы

Вывод отчетов организован с помощью pstats. Для маленьких объектов кода лучше использовать [[timeit]]

Запускается через `run()`. В данном примере мы получим вывод функции и отчет

```python
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()')
```

```shell
[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()`? который позволяет передать простое выражение  с параметрами через контекст. [Смотри тут](https://docs.python.org/3/library/profile.html#profile.runctx)

pstats позволяет создавать пользовательский отчет, сохраняя исходные данные профилирования, полученные с `run()` или `runctx()`. Обработку данных выполняет `pstats.Stats`. [Смотри тут](https://docs.python.org/3/library/profile.html#the-stats-class)

С помощью [gprof2dot](https://github.com/jrfonseca/gprof2dot) результат работы профилировщика можно визуализировать.

Смотри еще:

- [документация](https://docs.python.org/3/library/profile.html)
- [[timeit]]
- [[time]]
- [[python-standart-library]]


[timeit]: timeit "Timeit"
[time]: time "Time"
[python-standart-library]: ../lists/python-standart-library "Стандартная библиотека python и полезные ресурсы"