如何分析 Python 脚本?

欧拉项目和其他编码竞赛通常有最长的运行时间,或者人们吹嘘他们的特定解决方案运行的速度有多快。使用Python,有时方法有些笨拙 - 即向中添加计时代码。__main__

分析Python程序运行需要多长时间的好方法是什么?


答案 1

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 Profiling
也通过YouTube


答案 2

不久前,我制作了pycallgraph,它从你的Python代码中生成可视化。编辑:我已经更新了示例以使用3.3,这是撰写本文时的最新版本。

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

pycallgraph graphviz -- ./mypythonscript.py

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

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

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

其中任何一个都会生成一个类似于下图的文件:pycallgraph.png

enter image description here


推荐