Python 为什么cProfile只在代码中运行一次?

Python 为什么cProfile只在代码中运行一次?,python,profiling,benchmarking,timeit,cprofile,Python,Profiling,Benchmarking,Timeit,Cprofile,另一方面,timeit在代码中运行1000000次,以便与其他代码进行合理的渐进比较。cProfile只对代码运行一次,结果0.000中只有3位小数,不足以获得完整的图像 您会得到这样的无用结果: ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 {built-in method builtins.exec} 1

另一方面,timeit在代码中运行1000000次,以便与其他代码进行合理的渐进比较。cProfile只对代码运行一次,结果0.000中只有3位小数,不足以获得完整的图像

您会得到这样的无用结果:

   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的目的是获得功能的吞吐量,这将始终需要代码运行多次,以淡出边缘情况并给出良好的平均值

另一方面,cProfile用于分析函数堆栈的每个子调用,以揭开函数内部发生的所有神奇之处


时间IT将告诉您需要进行一些优化才能正常工作,而cProfile将为您指出正确的方向,告诉您堆栈的哪一小部分占用了您的周转时间。

您最好使用。但是,timeit是用于小片段的,这里的cProfile只是表明您关注的特定代码对于整个程序来说是无关紧要的。您确实提出了一个很好的观点,在大型程序中运行默认timeit是不可能的。而且,默认timeit不会在常规代码中运行1ml次。除非指定了运行次数,否则它将动态缩放实际运行的次数。如果您在这段代码上得到默认的1mil运行,这意味着它速度快得离谱。如果只是一些定义,而根本没有实际的计算,我也不会感到惊讶。这与您的cProfile 0's@roganjosh动态缩放是什么意思?文档中明确指出,运行次数参数的默认参数是1mil:timeit.timeitstmt='pass',setup='pass',timer=,number=1000000 Hmm,也许您是对的。我使用神奇的%timeit,它绝对可以缩放。即使代码运行时间为0.01秒,您也需要等待将近3个小时才能完成测试。我会看看缩放是否特别限于您最好使用的神奇方法。但是,timeit是用于小片段的,这里的cProfile只是表明您关注的特定代码对于整个程序来说是无关紧要的。您确实提出了一个很好的观点,在大型程序中运行默认timeit是不可能的。而且,默认timeit不会在常规代码中运行1ml次。除非指定了运行次数,否则它将动态缩放实际运行的次数。如果您在这段代码上得到默认的1mil运行,这意味着它速度快得离谱。如果只是一些定义,而根本没有实际的计算,我也不会感到惊讶。这与您的cProfile 0's@roganjosh动态缩放是什么意思?文档中明确指出,运行次数参数的默认参数是1mil:timeit.timeitstmt='pass',setup='pass',timer=,number=1000000 Hmm,也许您是对的。我使用神奇的%timeit,它绝对可以缩放。即使代码运行时间为0.01秒,您也需要等待将近3个小时才能完成测试。我来看看缩放是否特别局限于魔术方法