py-spy: Python程序的性能分析工具

发布于:2023-01-19 ⋅ 阅读:(778) ⋅ 点赞:(0)

        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程序运行在同一个进程,这将会降低该进程的速度并且影响一些操作。这意味着这些工具不能在生产环境上使用,因为他们将会给要调试的进程带来不可忽视的影响。