Python cProfile 结果:ncalls 的两个数字

45 投票
1 回答
7751 浏览
提问于 2025-04-18 02:23

我最近开始对我正在开发的服务器应用程序进行性能分析,想找出一些多余的处理器时间是怎么花掉的,并寻找让程序运行得更顺畅的方法。

总体来说,我觉得我已经掌握了如何使用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)

1 个回答

55

较小的数字是指“原始”调用的次数,也就是那些不涉及递归的调用次数。较大的数字则是所有调用的总和,包括递归调用。因为深拷贝(deepcopy)是通过递归实现的,这意味着你直接调用深拷贝的次数是1724次,但它实际上为了复制子对象,自己又调用了大约383,000次。

撰写回答