为什么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
会为您指明正确的方向,告诉您堆栈的哪个微小部分占用了您的周转时间。
另一方面,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
会为您指明正确的方向,告诉您堆栈的哪个微小部分占用了您的周转时间。