在使用cProfile分析的python脚本中,tottime和cumtime有什么区别?

tak*_*shi 58 python cprofile

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

python -m cProfile -s tottime main.py
Run Code Online (Sandbox Code Playgroud)

我得到的输出是(只复制粘贴输出的顶行):

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}

...
Run Code Online (Sandbox Code Playgroud)

(4.674)如何tottimecumtime(13.598)不同main.py,因为这个函数(即整个脚本)只被调用一次?

Mar*_*ers 79

tottime仅在功能中花费的总时间.cumtime是函数中花费的总时间加上此函数调用的所有函数.

如果函数从不调用其他任何东西,那么这两个值将是相同的.例如,{waitKey}似乎没有调用任何其他内容:

  459    2.381    0.005    2.381    0.005 {waitKey}
Run Code Online (Sandbox Code Playgroud)

但是getPacket()调用其他函数,所以它的cumtime列包含这些调用的时间:

 2142    2.964    0.001    4.663    0.002 load_aerdat3.py:61(getPacket)
Run Code Online (Sandbox Code Playgroud)

main.py行涵盖了在函数之外运行的所有代码,全局代码; 只是该级别的语句运行时间为4.674秒,但由于这些语句称为其他函数,因此main.py代码的总累计时间加上所有函数调用的时间为13.598秒.

文档:


在给定函数中花费的总时间的tottime(并且不包括调用子函数的时间)

[...]

cumtime
是在这个和所有子功能(从调用到退出)中花费的累积时间.即使对于递归函数,该数字也是准确的.

  • @JohnSmithOptional:任何在 Python 代码中实现的东西,都可以被检测。字符串切片不能被检测,因为它是在本地机器代码中实现的,从 C 编译。 (2认同)