python程序性能分析工具py-spy

之前有介绍过 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》