如何分析 Python 脚本?

新手上路,请多包涵

Project Euler 和其他编码竞赛通常有最长的运行时间,或者人们夸耀他们的特定解决方案运行速度有多快。使用 Python,有时这些方法有些笨拙 - 即,将计时代码添加到 __main__

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

原文由 Chris Lawlor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 633
2 个回答

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

原文由 Chris Lawlor 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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 文件:

在此处输入图像描述

原文由 gak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题