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 替代方案。

运行代码

将原来的 pythonpython3 命令替换为 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