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

什么是评测和性能测试python代码的最佳实践和工具?,python,performance,profiler,Python,Performance,Profiler,可能重复: 什么是评测和性能测试python代码的最佳实践和工具? 任何快速的胜利在这里或建议 CProfile seams很受欢迎,下面有一些很棒的注释/答案,它们都是非常好的答案/教程。投反对票,我会在一两天内选出第一名。谢谢@senderle和@campos.ddc 一旦发现问题区域,是否有任何习惯用法和/或技巧来转换代码以加快速度?是经典的分析工具。使用它的基本方法是: 在这里,我在我编写的一个参考实现的测试例程中调用了它 me@mine $ python -m cProfile me

可能重复:

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

CProfile seams很受欢迎,下面有一些很棒的注释/答案,它们都是非常好的答案/教程。投反对票,我会在一两天内选出第一名。谢谢@senderle和@campos.ddc

一旦发现问题区域,是否有任何习惯用法和/或技巧来转换代码以加快速度?

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

在这里,我在我编写的一个参考实现的测试例程中调用了它

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}
me@mine$python-m cProfile mersenne.twister.py
真的
真的
1000000
1003236次函数调用,耗时2.163 CPU秒
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
1    0.000    0.000    2.163    2.163 :1()
1 0.001 0.001 2.162 2.162梅森捻线机py:1()
3 0.001 0.000 0.001 0.000梅森捻线机py:10(初始根)
1000014 1.039 0.000 1.821 0.000梅森捻线机py:19(摘录号)
1 0.000 0.000 0.000 0.000梅森捻线机py:3(捻线机)
1603 0.766 0.000 0.782 0.000梅森捻线机py:33(生成编号)
1 0.000 0.000 0.000 0.000梅森捻线机py:4(初始)
1 0.317 0.317 2.161 2.161梅森捻线机py:42(_试验)
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{方法'disable'的''lsprof.Profiler'对象}
16080.0380.000 0.0380.000{范围}
ncalls
是调用函数的次数
tottime
是在函数中花费的总时间,不包括在子函数调用中花费的时间
percall
tottime/ncalls
cumtime
是在函数中花费的时间,包括在子函数调用中花费的时间。剩下的数据如下:
filename:lineno(func\u name)

在大多数情况下,首先查看
ncall
tottime
。在上面的数据中,您可以看到该程序花费的大部分时间发生在
extract\u number
中。此外,我们可以看到,
extract\u number
被调用多次(1000014)。因此,我所能做的任何加速
提取\u number
的事情都将显著加快此测试代码的执行。如果它给我一微秒的增益,那么增益将乘以1000014,得到一整秒的增益

然后我应该做
generate\u numbers
。这方面的收益不会有太大的影响,但它们可能仍然很重要,而且由于这一功能又消耗了0.7秒,因此有一些好处可以利用


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

谢谢senderle,有关于如何解释结果并采取行动的提示吗?@Mattalock您可能想查看python官方文档中关于评测的内容:很好的链接,谢谢Rik。我去看看。除了分析,还有其他习惯用法吗?
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}