py-spy是一个python程序的采样性能分析工具。可以在不重启程序或修改代码的情况下可视化地展示Python程序的时间消耗情况。py-spy的开销很低:它用rust编写、和要分析的Python程序不在同一个进程,这意味着py-spy可以安全地在生产环境使用。
py-spy支持的操作系统有:Linux、OSX、Windows和FreeBSD,支持对现有的所有CPython解释器进行性能分析(版本:2.3-2.7 和3.3-3.10)。
安装
预先编译好的二进制wheels可以通过PyPI安装:
pip install py-spy
你也可以从github上下载: GitHub Releases Page
如果你是Rust用户,py-spy也可以通过cargo安装:
cargo install py-spy
MacOS:
brew install py-spy
Aprh Linux:
yay -S py-spy
Alpine Linux:
apk add py-spy --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
用法
py-spy通过命令行运行,把你要分析的进程PID或者Python程序作为参数。py-spy有三个子命令:record、top和dump。
record
py-spy可以用record命令把分析解决记录到一个文件里。比如,你可以通过以下命令生成Python进程的火焰图:
py-spy record -o profile.svg --pid 12345
# OR
py-spy record -o profile.svg -- python myprogram.py
会生成一个可以交互的SVG文件,类似这样子:
你可以通过--fomat参数改变它输出的文件格式,比如生成一个 speedscope文件或者是原始数据文件。可以运行py-spy record --help查看其他选项的介绍,包括改变采样频率、过滤线程、分析原始的C扩展、展示线程ID、分析子进程等等。
top
top命令动态地展示进程中当前占用时间最多的函数。跟unix系统中的top命令有些像。使用方法:
py-spy top --pid 12345
# OR
py-spy top -- python myprogram.py
会实时更新进程的情况:
dump
py-spy通过dump命令还可以展示当前进程所有线程的调用堆栈。
py-spy dump --pid 12345
会输出所有线程的堆栈和一些其他有用的信息:
如果你想知道你的进程在哪里卡住了,这个对你会非常有用。这个命令加上参数 --locals还可以输出各层栈的局部变量。
FAQ:
为什么需要这个profile工具呢?
这个项目目标是让你能够profile或者调试正在运行的Python程序,即使是在生产环境。
虽然已经有很多Python的profile工具,但是几乎所有的都需要一定程度上修改要分析的程序。通常情况下,profile工具还和Python程序运行在同一个进程,这将会降低该进程的速度并且影响一些操作。这意味着这些工具不能在生产环境上使用,因为他们将会给要调试的进程带来不可忽视的影响。