什么是用于分析和性能测试python代码的最佳实践和工具?

Mat*_*ock 4 python performance profiler

可能重复:
如何分析我的代码?

什么是用于分析和性能测试python代码的最佳实践和工具?这里有任何快速获胜或建议。

CProfile接缝很流行,下面还有一些很棒的注释/答案,都是很好的答案/教程。投票出去,我将在一两天内选出最热门的一个。谢谢@senderle和@ campos.ddc

一旦发现问题区域,是否有任何惯用法和/或技巧可用于转换代码以使其更快?

sen*_*rle 5

cProfile是经典的分析工具。使用它的基本方法如下

python -m cProfile myscript.py
Run Code Online (Sandbox Code Playgroud)

在这里,我将其称为我编写的mersenne扭曲器的参考实现的测试例程。

me@mine $ python -m cProfile mersenne.twister.py 
True
True
1000000
         1003236 function calls in 2.163 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.163    2.163 <string>:1(<module>)
        1    0.001    0.001    2.162    2.162 mersenne.twister.py:1(<module>)
        3    0.001    0.000    0.001    0.000 mersenne.twister.py:10(init_gen)
  1000014    1.039    0.000    1.821    0.000 mersenne.twister.py:19(extract_number)
        1    0.000    0.000    0.000    0.000 mersenne.twister.py:3(Twister)
     1603    0.766    0.000    0.782    0.000 mersenne.twister.py:33(generate_numbers)
        1    0.000    0.000    0.000    0.000 mersenne.twister.py:4(__init__)
        1    0.317    0.317    2.161    2.161 mersenne.twister.py:42(_test)
        1    0.001    0.001    2.163    2.163 {execfile}
        1    0.000    0.000    0.000    0.000 {len}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
     1608    0.038    0.000    0.038    0.000 {range}
Run Code Online (Sandbox Code Playgroud)

ncalls是一个函数被调用的次数。tottime是一个函数花费的总时间,不包括子函数调用花费的时间。percalltottime / ncallscumtime是在该功能上花费的时间,包括在子功能调用中花费的时间。而剩余的数据如下:filename:lineno(func_name)

在大多数情况下,看看ncallstottime第一。在以上数据中,您可以看到此程序花费的大部分时间发生在中extract_number。此外,我们可以看到它extract_number被称为多次(1000014)。因此,我可以做的任何加速工作extract_number都将大大加快此测试代码的执行速度。如果它使我获得微秒的增益,则该增益将乘以1000014,从而获得完整的第二增益。

那我应该继续努力generate_numbers。增益无关紧要,但是它们可能仍然很重要,并且由于该功能又烧了0.7秒,因此有一些好处。

那应该给你大概的想法。但是请注意,tottime例如在递归的情况下,该数字有时可能具有欺骗性。