你如何描述脚本?

欧拉项目和其他编码竞赛往往有最长的时间来运行,或者人们吹嘘他们的特定解决方案的运行速度。 使用python,有时候这些方法有点奇怪 - 即将时间代码添加到__main__

什么是一个好的方法来分析一个python程序需要运行多久?


Python包含一个名为cProfile的分析器。 它不仅提供了总运行时间,而且还分别计算每个函数的时间,并告诉您每个函数被调用的次数,从而可以轻松确定应该在哪里进行优化。

你可以在代码中或者从解释器中调用它,如下所示:

import cProfile
cProfile.run('foo()')

更有用的是,您可以在运行脚本时调用cProfile:

python -m cProfile myscript.py

为了使它更容易,我创建了一个名为'profile.bat'的小批处理文件:

python -m cProfile %1

所以我所要做的就是运行:

profile euler048.py

我得到这个:

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}

编辑:从PyCon 2013更新了一个很好的视频资源的链接,标题为Python分析


pycallgraph时间我做了pycallgraph ,它可以从你的Python代码生成一个可视化文件。 编辑:我已经更新了示例以使用最新版本。

pip install pycallgraph并安装GraphViz之后,您可以从命令行运行它:

pycallgraph graphviz -- ./mypythonscript.py

或者,您可以配置代码的特定部分:

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

with PyCallGraph(output=GraphvizOutput()):
    code_to_profile()

这些都会生成一个pycallgraph.png文件,类似于下面的图片:

在这里输入图像描述


值得指出的是,使用分析器只能在主线程上工作(默认情况下),并且如果使用它们,则不会从其他线程获取任何信息。 这可能是一个小问题,因为它在profiler文档中完全没有提到。

如果您还想要配置线程,您需要查看文档中的threading.setprofile()函数。

你也可以创建自己的threading.Thread子类来完成它:

class ProfiledThread(threading.Thread):
    # Overrides threading.Thread.run()
    def run(self):
        profiler = cProfile.Profile()
        try:
            return profiler.runcall(threading.Thread.run, self)
        finally:
            profiler.dump_stats('myprofile-%d.profile' % (self.ident,))

并使用ProfiledThread类而不是标准类。 它可能会给你更多的灵活性,但我不确定它是否值得,尤其是如果你使用的第三方代码不会使用你的类。

链接地址: http://www.djcxy.com/p/6697.html

上一篇: How can you profile a script?

下一篇: How does database indexing work?