什么是代码剖析?
代码剖析是一种技术,用于弄清程序中的时间是如何度过的。更详细地说,剖析是一组描述程序各部分执行频率和时间的统计数据。使用正确的Python剖析工具--以及使用正确的Python桌面--可以为你节省大量的时间,在你的Python应用程序中追寻瓶颈和慢下来。
通过这些统计数据,我们可以找到程序的 "热点",并思考改进的方法。有时,在一个意想不到的地方出现的热点可能会给你提示你的程序中的错误。
Python 是否有一个内置的代码剖析器?
Python标准库提供了同一个剖析接口的两种不同实现。
- cProfile。一个具有合理开销的C语言扩展,使其适合于对长期运行的程序进行剖析。cProfile是对大多数用户的推荐做法。cProfile是基于lsprof建立的,由Brett Rosen和Ted Czotter贡献。
- profile。一个纯 Python 模块,其接口被 cProfile 模仿,但它为剖析程序增加了大量的开销。如果你想以某种方式扩展剖析器,用这个模块你的任务可能会更简单。最初由 Jim Roskind 设计和编写。
我怎样才能得到 cProfile 库?
由于 cProfile 是一个内置的 Python 库,不需要进一步安装。
如何获得snakeviz库,以使Python剖析工具的结果可视化?
下面是使用pip获得snakeviz 稳定版的方法。
pip install snakeviz
如何用cProfile来剖析Python函数?
例如,运行下面的代码,对一个从regex库中获取单一参数的函数进行剖析。
import cProfile
import re
cProfile.run('re.compile("foo|bar")')
上述操作将运行re.compile()并打印出如下的profile结果(这里是PyScripter IDE上的输出)。

或者你可以使用profile,而不是cProfile,像这样。
import profile
import re
profile.run('re.compile("foo|bar")')
它也会给你类似的输出。

第一行显示,有214个调用被监控。其中207个调用是原始的,意味着它们不是由递归引起的。接下来的一行。Ordered by: standard name, 表示最右边那一列的文本字符串被用来对输出进行排序。
这一列的标题包括。
| ncalls | 呼叫的数量。 |
| tottime | 在给定函数中花费的总时间(并且不包括调用子函数的时间)。 |
| percall | tottime除以ncalls的商数。 |
| cumtime | 在这个函数和所有子函数中花费的累计时间(从调用到退出)。这个数字即使对于递归函数也是准确的。 |
| percall | cumtime的商数除以原始调用。 |
| filename:lineno(function) | 提供每个函数的各自数据。 |
如何在运行时对一个 Python 脚本进行剖析?
更有用的是,我们可以通过在运行时运行 cProfile 来剖析一个现有的 Python 脚本。
让我们在我们的网络刮削脚本scrapyApp.py上测试一下,该脚本在这篇文章中被使用。
你可以在运行Python脚本时使用这个命令来调用cProfile。
python -m cProfile scrapyApp.py
以下是剖析结果的摘录。

如何使用 cProfile 保存 Python 剖析工具的结果?
与其只在命令行上打印剖析结果,我们可以通过把它导出到一个文件中,使它对进一步的结果更有用。
下面是你如何做的。
python -m cProfile -o stats.dump scrapyApp.py
上述命令将把剖析结果导出到一个.dump文件中。
这个.dump文件会产生杂乱无章的奇怪字符。所以,如果你喜欢可读性,你可以用这个命令将结果保存为.txt文件。
python -m cProfile scrapyApp.py > stats.txt
下面是在文本编辑器中打开的.txt文件的摘录。

如何用snakeviz将Python剖析工具的结果可视化?
为了可视化你的Python代码剖析结果,用snakeviz调用.dump文件,使用这个命令。
snakeviz stats.dump
它将启动snakeviz网络服务器,并在你的默认浏览器上打开可视化结果。snakeviz网络服务器默认在127.0.0.1:8080启动。
你可以设置可视化的风格、深度和截止点。
用Icicle风格进行可视化。

用Sunburst风格进行可视化。

以表格的形式摘录所有的剖析结果。

很神奇,不是吗?现在你可以用cProfile轻松地找出你程序中的瓶颈,并用snakeviz专业地可视化它们。
恭喜你,现在你已经了解了内置的Python剖析工具现在你可以实施它来找到你的代码的瓶颈,并进一步改进它