cProfile输出上的tottime和cumtime有什么区别?


71

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

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,因为该功能(即整个脚本)只调用一次?

Answers:


93

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.674秒才能运行,但是由于这些语句调用了其他函数,因此main.py代码加上所有函数调用的总累积时间为13.598秒。

文档中

tottime
用于在给定的功能花费的总时间(以及在呼叫作出子功能不包括时间)

[...]

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


太好了,现在我明白了!不知何故我错过了tottime不包括子功能。。谢谢!
高桥

什么算作子功能,什么不算?例如,如果我取一个字符串的一部分,它算作对子函数的调用吗?还是算作主要功能中的内置基本操作?
约翰·史密斯

1
@JohnSmithOptional:任何用Python代码实现的东西,都可以进行检测。字符切片不能仪器,因为它是在本机机器代码实现的,从C.编译
马亭皮特斯

感谢Martijn,现在我明白了为什么概要文件模块返回此类结果。
约翰·史密斯可选
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.