PyPy JIT 加速 Python 执行
FreeGuideOnline
最新
2026-07-09
bash pypy3 --version
输出示例:Python 3.9.16 (7.3.11+dfsg-1, Aug 2023) [PyPy 7.3.11 with GCC ...]
## 迁移项目到 PyPy
### 创建虚拟环境
```bash
pypy3 -m venv pypy_venv
source pypy_venv/bin/activate # Linux/macOS
pypy_venv\Scripts\activate # Windows
安装依赖
大部分纯 Python 包可直接通过 pip 安装:
pip install flask requests
如果某个包依赖 C 扩展,可检查是否有 pypy- 前缀的适配版本,或使用 ctypes 替代方案。
运行代码
将原来的 python 或 python3 命令替换为 pypy3 即可:
pypy3 your_script.py
PyPy 性能优势示例
示例1:斐波那契数列(递归版)
# fib.py
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
if __name__ == "__main__":
import time
start = time.time()
result = fib(35)
print(f"Result: {result}, Time: {time.time()-start:.3f}s")
对比结果(典型值):
- CPython 3.9: ~3.2 秒
- PyPy 3.9: ~0.4 秒 (提速约 8 倍)
示例2:浮点运算密集循环
# compute_pi.py
def approximate_pi(n):
s = 0.0
for i in range(1, n+1):
s += 1.0 / (i*i)
return (6.0 * s) ** 0.5
import time
start = time.time()
pi = approximate_pi(10**7)
print(f"Pi: {pi}, Time: {time.time()-start:.3f}s")
PyPy 往往能比 CPython 快 5~10 倍,因为 JIT 将浮点循环直接映射为 CPU 原生指令,避免了 PyFloat 对象的反复装箱/拆箱。
优化 PyPy 程序的实践技巧
1. 保持代码“JIT 友好”
- 避免频繁的动态类型变化:如果变量在循环中一会是整数一会是字符串,JIT 需要进行回退(deoptimization),影响性能。
- 使用内置数据结构:列表、字典等在 PyPy 中高度优化。
- 将热点逻辑放入函数:JIT 以函数或循环为单位编译,清晰地划分函数有助于编译。
2. 预热(Warm-up)很重要
JIT 编译需要时间累积 profile 数据,短脚本可能看不到明显加速。如果需要性能基准测试,至少让程序运行数秒钟。
pypy3 -c "for i in range(10**7): pass" # 预热示例
3. 利用环境变量监控 JIT
PyPy 提供了一些调试参数,可输出 JIT 行为日志:
PYPYLOG=jit-log-opt:logfile pypy3 your_script.py