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

Posted

技术标签:

【中文标题】什么是分析和性能测试 python 代码的最佳实践和工具? [复制]【英文标题】:Whats are best practices and tools for profiling and performance testing python code? [duplicate] 【发布时间】:2012-02-23 00:54:26 【问题描述】:

可能重复:How to profile my code?

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

CProfile 接缝很受欢迎,下面有一些很棒的注释/答案,都是非常好的答案/教程。投票吧,我会在一两天内选出前一个。谢谢@senderle 和@campos.ddc

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

【问题讨论】:

很好的链接,谢谢瑞克。我会检查一下。除了 profiling 还有什么其他的习语吗? Here's a quick win. 【参考方案1】:

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 被调用 many (1000014) 次。所以我能做的任何事情来加速extract_number 都会显着加速这个测试代码的执行。如果它让我获得了 微秒,那么增益将乘以 1000014,得到一整秒的增益。

那么我应该在generate_numbers 上工作。那里的收益不会那么重要,但它们可能仍然很重要,并且由于该功能会再消耗 0.7 秒,因此会有一些好处。

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

【讨论】:

感谢 senderle,关于如何解释结果并采取行动的任何提示? @MattAlcock 您可能想查看有关 profiling 的 python 官方文档:docs.python.org/library/profile.html

以上是关于什么是分析和性能测试 python 代码的最佳实践和工具? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

hadoop 基准测试的最佳实践是啥?

AIOps根因分析最佳实践

python自动化测试开发利器ulipad最佳实践(可写python测试代码也可编写seleniumAppium等)

性能测试最佳实践

性能测试最佳实践

黄金法则:MySQL基准测试最佳实践