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

时间:2012-02-23 00:54:27

标签: python performance profiler

  

可能重复:
  How to profile my code?

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

CProfile接缝流行以及下面的一些精彩笔记/答案,都是非常好的答案/教程。投票,我会在一两天内选出最顶级的。谢谢@senderle和@ campos.ddc

一旦找到问题区域,是否有任何成语和/或提示转换代码以使其更快?

1 个答案:

答案 0 :(得分:5)

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

python -m cProfile myscript.py

在这里,我在我编写的mersenne twister参考实现的测试例程中调用它。

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}

ncalls是调用函数的次数。 tottime是在函数中花费的总时间,不包括在子函数调用中花费的时间。 percalltottime / ncallscumtime是函数中花费的时间,包括在子函数调用中花费的时间。其余数据如下:filename:lineno(func_name)

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

然后我应该在generate_numbers上工作。在那里获得的收益并不重要,但它们可能仍然很重要,而且由于这个功能再燃烧了0.7秒,所以有一些好处。

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