【问题标题】:What is the difference between tottime and cumtime on cProfile output?cProfile 输出上的 tottime 和 cumtime 有什么区别?
【发布时间】:2017-03-17 04:27:24
【问题描述】:

我正在使用 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}

...

tottime (4.674) 与 cumtime (13.598) 的 main.py 有何不同,因为这个函数(即整个脚本)只调用一次?

【问题讨论】:

    标签: python profiling cprofile


    【解决方案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.674 秒,但由于这些语句调用了其他函数,所以 main.py 代码的总累积时间加上所有函数调用为 13.598 秒。

    来自documentation

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

    [...]

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

    【讨论】:

    • 太好了,现在我明白了!不知何故,我错过了tottime 不包含子功能。谢谢!
    • 什么算作子功能,什么不算?例如,如果我取一段字符串,它是否算作对子函数的调用?还是它算作 main 函数内的一个内置的基本操作?
    • @JohnSmithOptional:任何在 Python 代码中实现的东西,都可以被检测。无法检测字符串切片,因为它是用 C 编译的本机机器代码实现的。
    • 感谢 Martijn,现在我明白了为什么配置文件模块会返回这样的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2019-04-01
    • 2015-11-18
    • 2020-12-02
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多