py-spy 性能采样工具小探

214 阅读2分钟

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 开发者必备工具之一。

参考: