如何在Python代码中进行性能分析和测试的最佳实践和工具?

2024-10-06 12:39:07 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
How to profile my code?

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

CProfile seams很流行,下面有一些很棒的注释/答案,都是很好的答案/教程。投票表决,我会在一两天内选出第一名。谢谢@senderle和@campos.ddc

一旦发现问题区域,是否有任何习惯用法和/或转换代码以使其更快的提示?


Tags: 工具to答案代码mycode教程性能
1条回答
网友
1楼 · 发布于 2024-10-06 12:39:07

^{}是典型的分析工具。使用它的基本方法是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数字有时可能是欺骗性的,例如在递归的情况下。

相关问题 更多 >