py-spy 是一个高性能的 Python 采样分析器(sampling profiler),用于分析 Python 程序的性能瓶颈。它无需修改代码,也无需重启目标进程,支持对正在运行的 Python 程序进行实时性能分析。
1. 主要特点
- 无需代码侵入:不需要在代码中插入任何分析语句。
- 低开销:采样方式对性能影响极小,适合生产环境。
- 支持多版本 Python:包括 CPython 2.7、3.x。
- 可分析任意 Python 进程:只需指定进程号(PID)。
- 可生成火焰图(Flame Graph):直观展示性能热点。
2. 安装方法
pip install py-spy
或下载 官方二进制。
3. 基本用法
1. 查看正在运行的 Python 进程
py-spy top --pid <PID>
实时显示各函数的 CPU 占用情况。
2. 生成火焰图
py-spy record --pid <PID> --output profile.svg
采样一段时间后,生成 profile.svg 火焰图文件,可用浏览器打开查看。
3. 直接分析脚本
py-spy top -- python myscript.py
或
py-spy record -- python myscript.py
4. 常用参数说明
--pid <PID>:指定要分析的进程号。--output <file>:火焰图输出文件名。--rate <N>:采样频率(默认 100 次/秒)。--duration <seconds>:采样持续时间。--native:显示 C 扩展调用栈。--subprocesses:分析子进程。
5. 典型场景
- 性能瓶颈定位(找出最耗时的函数和代码段)
- 生产环境问题分析(无需重启服务)
- 代码优化前后对比
6. 示例:分析 Flask 服务
假设 Flask 服务运行在 PID 12345:
py-spy top --pid 12345
py-spy record --pid 12345 --output flask_profile.svg
7. 注意事项
- 需要目标进程的读取权限(Linux 下建议用 root 或同用户)。
- 仅支持 CPython,不支持 PyPy/Jython。
- 对多线程和异步代码也能有效分析。
总结:
py-spy 是 Python 性能分析的利器,操作简单、开销极低,适合开发和生产环境下的性能调优。火焰图让性能瓶颈一目了然,是 Python 开发者必备工具之一。
参考: