python 3.11 的 perf 支持默认未启用,需在 linux 下编译时添加 --with-perf 选项并安装 libpfm4-dev 和内核头文件,且运行时需满足 perf_event_paranoid 权限要求。

Python 3.11 自带 perf 支持,但默认不启用;需手动编译启用 --with-perf,且仅 Linux 有效。
为什么 perf 在 Python 3.11 中不可用?
Python 3.11 引入了对 Linux perf 工具的原生支持(通过 PyPerf),用于采集函数级、指令级性能事件(如 cache-misses、cycles)。但它不是开箱即用的:
- CPython 源码编译时必须显式传入
--with-perf配置选项 - 系统需安装
libpfm4-dev(或libpfm4)和内核头文件(linux-headers-$(uname -r)) - macOS / Windows 完全不支持 ——
perf是 Linux 内核专属工具 - 即使编译成功,运行时还需 root 权限或
/proc/sys/kernel/perf_event_paranoid≤ 2
如何编译启用 perf 的 Python 3.11?
跳过 pyenv / conda 等包管理器,直接从源码构建(以 Ubuntu/Debian 为例):
sudo apt install -y build-essential zlib1g-dev libncurses5-dev \
libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev \
libpfm4-dev linux-headers-$(uname -r)
<p>curl -O <a href="https://www.php.cn/link/57c7a0e5e1fe44af505cb32552d9403b">https://www.php.cn/link/57c7a0e5e1fe44af505cb32552d9403b</a>
tar -xf Python-3.11.9.tgz
cd Python-3.11.9</p><p>./configure --enable-optimizations --with-perf
make -j$(nproc)
sudo make altinstall # 避免覆盖系统 python3</p>
验证是否生效:
python3.11 -c "import sys; print(hasattr(sys, 'perf'))" # 输出 True 即表示已启用
sys.perf 的基本用法与常见陷阱
启用后,sys.perf 是一个上下文管理器对象,用于开启/停止采样。它不替代 cProfile,而是提供更低层的硬件事件追踪能力:
- 必须在主线程中使用 —— 子线程调用会静默失败
- 不支持嵌套:同一时间只能有一个活跃的
sys.perf会话 - 默认只采集
cycles,要加其他事件需显式传参,例如:sys.perf("cycles,instructions,cache-misses") - 输出是二进制 perf.data 文件,需用系统
perf script或perf report解析,Python 不提供内置解析器 - 若看到
PermissionError: [Errno 1] Operation not permitted,检查perf_event_paranoid值(临时修复:echo 1 | sudo tee /proc/sys/kernel/perf_event_paranoid)
替代方案:没权限编译?用 py-spy 或 scalene
如果你无法重装 Python(如生产环境 Docker、受限 CI 环境),sys.perf 就走不通。此时更现实的选择是:
-
py-spy:无需修改目标进程,支持 attach 到正在运行的 Python 3.7+ 进程,输出火焰图,命令简单:py-spy record -p <pid> -o profile.svg</pid> -
scalene:专为 Python 设计,能同时分析 CPU、内存、GPU,且支持行级精度,安装即用:pip install scalene && python -m scalene your_script.py - 注意:
cProfile和line_profiler仍是调试热点函数的最快路径,别为了“新”而绕远路
真正卡点往往不在工具本身,而在你能否拿到带符号表的 Python 二进制(比如 Alpine 镜像里删掉了 .debug)、是否允许提升 perf 权限、以及是否有足够权限部署非标准 Python —— 这些比选哪个函数名更重要。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











