CProfile 输出的 tottime 和 Cumtime 有什么区别?

我使用 cProfile 使用以下命令分析一个 python 脚本 main.py:

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}


...

对于 main.pytottime(4.674)与 cumtime(13.598)有什么不同,因为这个函数(即。整个脚本)只调用一次?

31544 次浏览

tottime is the total time spent in the function alone. cumtime is the total time spent in the function plus all functions that this function called.

The two values is going to be the same if a function never calls anything else. For example, {waitKey} doesn't appear to invoke anything else:

  459    2.381    0.005    2.381    0.005 {waitKey}

but getPacket() calls other functions, so it's cumtime column includes the time for those calls:

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

The main.py line covers all code run outside of functions, the global code; just the statements at that level took 4.674 seconds to run, but because those statements called other functions, the total cumulative time of the main.py code plus all function calls made is 13.598 seconds.

From the documentation:

tottime
for the total time spent in the given function (and excluding time made in calls to sub-functions)

[...]

cumtime
is the cumulative time spent in this and all subfunctions (from invocation till exit). This figure is accurate even for recursive functions.