之前有介绍过 Uber 开发的性能分析工具 pyflame 《用pyflame来做python程序的性能分析》,最近又发现一个更好用的,https://github.com/benfred/py-spy
pyflame是用c++编写,而py-spy是用rust语言写的,都是编译型语言,不过pyflame的缺点是现在还不支持python 3.7版本,以及只能在linux环境上运行。
而py-spy解决了pyflame的问题,具体可以看它的github主页说明。
安装方法很简单,直接pip源安装就好了:
pip install py-spy
使用方法示例:
$ py-spy --help py-spy 0.1.5 A sampling profiler for Python programs USAGE: py-spy [FLAGS] [OPTIONS] --pid <pid> [python_program]... FLAGS: --dump Dump the current stack traces to stdout -F, --function Aggregate samples by function name instead of by line number -h, --help Prints help information -V, --version Prints version information OPTIONS: -d, --duration <duration> The number of seconds to sample for when generating a flame graph [default: 2] -f, --flame <flamefile> Generate a flame graph and write to a file -p, --pid <pid> PID of a running python program to spy on -r, --rate <rate> The number of samples to collect per second [default: 1000] ARGS: <python_program>... commandline of a python program to run
程序可以直接像top命令那样不断输出,也可以运行一断时间后生成SVG版本的火焰图。
py-spy --flame flame.svg -F -p 10650 -d 10
跟pyflame相比,pyflame生成的是火焰图原始数据文件,具体svg文件还需要自己再手动调用程序生成,py-spy则是一次性到位直接输出 svg图片,svg文件可以直接在浏览器上打开。
不过,py-spy调试的是程序使用时间的统计,也就是可以观察哪个函数执行占用的时间长,但就内存使用情况,好像就不能体现,比如想要找内存泄漏的根源,这个工具就爱莫能助了。
内存泄漏分析,可以使用 guppy/heapy ,之前也有发文章《python内存泄漏分析工具:guppy/heapy》