为什么cProfile只运行通过代码一次?

Why does cProfile only run through the code once?

另一方面,timeit 运行代码 1,000,000 次以获得与其他代码的合理渐近比较。 cProfile只跑一遍代码,结果只有小数点后三位(0.000),不够全面。

你得到这样无用的结果:

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
    1    0.000    0.000    0.000    0.000 <string>:1(<module>)
    1    0.000    0.000    0.000    0.000 a.py:27(function)
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

timeit 的目的是获得函数的吞吐量,这将始终需要代码多次 运行 以淡出边缘情况并给出良好的平均值。

而另一方面,cProfile 用于分析函数堆栈的每个子调用,以揭开函数内部发生的所有魔法的神秘面纱。

timeit 会告诉您需要进行一些优化才能运行,而 cProfile 会为您指明正确的方向,告诉您堆栈的哪个微小部分占用了您的周转时间。