Подтвердить что ты не робот

В чем разница между tottime и cumtime в python script с профилем cProfile?

Я профилирую python script main.py с помощью cProfile с помощью следующей команды:

python -m cProfile -s tottime main.py

Выход, который я получаю (только скопировал верхние строки вывода):

10184337 function calls (10181667 primitive calls) in 13.597 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    4.674    4.674   13.598   13.598 main.py:2(<module>)
 2142    2.964    0.001    4.663    0.002 load_aerdat3.py:61(getPacket)
  459    2.381    0.005    2.381    0.005 {waitKey}
1667989    1.170    0.000    1.170    0.000 {numpy.core.multiarray.array}

...

Как tottime (4.674) отличается от cumtime (13.598) для main.py, так как эта функция (т.е. целое script) вызывается только один раз?

4b9b3361

Ответ 1

tottime - общее время, затрачиваемое только на функцию. cumtime - это общее время, проведенное в функции плюс все функции, которые эта функция вызывала.

Два значения будут одинаковыми, если функция никогда не вызывает ничего другого. Например, {waitKey} не вызывает ничего другого:

  459    2.381    0.005    2.381    0.005 {waitKey}

но getPacket() вызывает другие функции, поэтому в столбце cumtime указано время для этих вызовов:

 2142    2.964    0.001    4.663    0.002 load_aerdat3.py:61(getPacket)

Строка main.py охватывает весь код, выполняемый за пределами функций, глобальный код; только инструкции на этом уровне заняли 4,647 секунды, но поскольку эти выражения называются другими функциями, общее суммарное время кода main.py плюс все сделанные вызовы функций составляет 13,598 секунды.

В документации :

tottime
для общего времени, затраченного на заданную функцию (и исключая время, затраченное на вызовы подфункций)

[...]

cumtime
представляет собой совокупное время, затрачиваемое на эту и все подфункции (от вызова до выхода). Этот показатель является точным даже для рекурсивных функций.