问题 Python cProfile结果:ncalls的两个数字


我刚刚开始分析我一直在研究的服务器应用程序,试图找出处理器处理时间过长的地方,并寻找使事情更顺畅的方法。

总的来说,我认为我已经很好地使用了cProfile和pstats,但我不明白一些函数如何在ncalls列中列出两个数字。

例如,在下面的结果中,为什么列出了所有copy.deepcopy的两个数字?

         2892482 function calls (2476782 primitive calls) in 5.952 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       27    0.015    0.001    5.229    0.194 /usr/local/lib/python2.7/twisted/internet/base.py:762(runUntilCurrent)
        7    0.000    0.000    3.109    0.444 /usr/local/lib/python2.7/twisted/internet/task.py:201(__call__)
        7    0.000    0.000    3.109    0.444 /usr/local/lib/python2.7/twisted/internet/defer.py:113(maybeDeferred)
        5    0.000    0.000    2.885    0.577 defs/1sec.def:3690(onesec)
        5    2.100    0.420    2.885    0.577 defs/1sec.def:87(loop)
     1523    0.579    0.000    2.105    0.001 defs/cactions.def:2(cActions)
384463/1724    0.474    0.000    1.039    0.001 /usr/local/lib/python2.7/copy.py:145(deepcopy)
33208/1804    0.147    0.000    1.018    0.001 /usr/local/lib/python2.7/copy.py:226(_deepcopy_list)
17328/15780    0.105    0.000    0.959    0.000 /usr/local/lib/python2.7/copy.py:253(_deepcopy_dict)

12909
2018-04-11 17:28


起源



答案:


较小的数字是“原始”或非递归调用的数量。较大的数字是调用的总数,包括递归调用。由于deepcopy是递归实现的,这意味着您直接调用了deepcopy 1724次,但它最终调用自身~383k次来复制子对象。


14
2018-04-11 18:03



谢谢。这符合我的发现 docs.python.org/2/library/profile.html#instant-user-s-manual ......当你问一个问题,然后在几分钟后找到答案并进一步挖掘时,那令人沮丧的时刻。我无法回复自己的帖子,因为我之前从未真正在这个网站上发帖并且不到10个代表。 - Andrew Baird


答案:


较小的数字是“原始”或非递归调用的数量。较大的数字是调用的总数,包括递归调用。由于deepcopy是递归实现的,这意味着您直接调用了deepcopy 1724次,但它最终调用自身~383k次来复制子对象。


14
2018-04-11 18:03



谢谢。这符合我的发现 docs.python.org/2/library/profile.html#instant-user-s-manual ......当你问一个问题,然后在几分钟后找到答案并进一步挖掘时,那令人沮丧的时刻。我无法回复自己的帖子,因为我之前从未真正在这个网站上发帖并且不到10个代表。 - Andrew Baird