PyPy入门:安装、配置与第一个程序
说实话,我第一次接触PyPy时,心里是有点抵触的。毕竟CPython用得好好的,为什么要换?直到我在一个数据处理项目里,代码跑了整整40分钟还没出结果……嗯,那次之后,我老老实实装上了PyPy。
这一章,我们就来聊聊PyPy的安装、它和CPython到底差在哪,以及怎么写你的第一个PyPy程序。
PyPy的安装与配置
安装PyPy其实比你想的简单。我个人习惯用官方压缩包,因为干净、可控。
Windows下的安装
- 去PyPy官网下载对应你系统位数的压缩包(比如pypy3.10-v7.3.12-win64.zip)
- 解压到某个目录,比如
C:\pypy - 把
C:\pypy添加到系统环境变量PATH中 - 打开命令行,输入
pypy --version验证
Linux/macOS下的安装
我建议用包管理器,省心。
# Ubuntu/Debian
sudo apt install pypy3
# macOS (Homebrew)
brew install pypy3
# 验证安装
pypy3 --version
小提示: 如果你同时装了CPython和PyPy,记得用
pypy3 而不是 python3 来启动PyPy。我刚开始就老搞混,结果跑的还是CPython……
配置虚拟环境
我个人强烈建议给PyPy单独建一个虚拟环境。为什么呢?因为有些包在PyPy下可能不兼容,隔离起来更安全。
# 创建虚拟环境
pypy3 -m venv pypy_env
# 激活
# Windows: pypy_env\Scripts\activate
# Linux/macOS: source pypy_env/bin/activate
# 安装常用包
pip install numpy # 注意:PyPy对numpy支持有限,后面会讲
PyPy与CPython的核心差异
说白了,CPython是解释器,PyPy是带有JIT编译器的解释器。这个区别,决定了它们的性能表现。
| 对比维度 | CPython | PyPy |
|---|---|---|
| 执行方式 | 纯解释执行 | 解释 + JIT编译 |
| 启动速度 | 快(秒级) | 慢(需要预热) |
| 长期运行性能 | 稳定但慢 | 越跑越快(JIT优化) |
| 内存占用 | 相对较低 | 较高(JIT需要额外内存) |
| C扩展兼容性 | 完美支持 | 有限支持(CPython C API) |
| 垃圾回收 | 引用计数 + 分代回收 | 增量式GC(更适合大内存) |
核心结论: PyPy不是万能的。它最适合纯Python代码、长时间运行的计算密集型任务。如果你的项目大量依赖C扩展(比如numpy、pandas),PyPy可能反而更慢。
为什么会这样?我举个例子。你在CPython里写个循环100万次的加法,每次都要解释执行。但在PyPy里,JIT会识别出这段“热代码”,把它编译成机器码。第二次跑的时候,直接执行机器码,速度能快10倍以上。
不过,我记得有一次我在PyPy下跑一个用了大量正则表达式的脚本,结果比CPython还慢。后来一查,原来是PyPy的正则引擎实现方式不同,某些模式反而更慢。所以,一定要用真实场景测试,别光看理论数据。
第一个PyPy程序
来,我们写个简单的性能对比程序。你想想看,这样能直观感受到PyPy的威力。
# benchmark.py
import time
def heavy_computation(n):
"""一个计算密集型的函数"""
total = 0
for i in range(n):
total += i * i
return total
# 测试
start = time.time()
result = heavy_computation(10_000_000)
end = time.time()
print(f"结果: {result}")
print(f"耗时: {end - start:.4f} 秒")
分别用CPython和PyPy运行:
# 用CPython跑
python benchmark.py
# 输出: 耗时: 1.2345 秒
# 用PyPy跑(第一次)
pypy3 benchmark.py
# 输出: 耗时: 0.8765 秒(含JIT预热)
# 用PyPy跑(第二次,JIT已预热)
pypy3 benchmark.py
# 输出: 耗时: 0.1234 秒(快了10倍!)
注意: 第一次运行PyPy时,JIT需要“预热”。所以性能测试时,建议先跑一次“热身”,再正式计时。我曾经犯过这个错,第一次跑完就兴高采烈地报告性能提升,结果被同事指出数据不准确……尴尬。
PyPy的适用场景
根据我的经验,下面这些场景特别适合PyPy:
- 纯Python算法实现:比如排序、搜索、数学计算
- 长时间运行的服务器:JIT预热后性能稳定
- 数据处理脚本:如果不用pandas/numpy,纯Python处理
- 游戏逻辑:特别是物理模拟、AI决策等计算密集型部分
不适合的场景:
- 大量使用C扩展:比如numpy、pandas、opencv
- 短时间运行的脚本:JIT预热时间可能超过运行时间
- 内存极度敏感的环境:PyPy内存占用比CPython高
知识体系图
下面这张图,帮你理清本章的核心逻辑:
避坑指南
最后,分享几个我踩过的坑:
- 不要直接替换系统Python:我曾经把系统默认Python改成PyPy,结果一堆系统工具崩溃了。老老实实用虚拟环境或者显式调用
pypy3。 - 注意包兼容性:有些包在PyPy下没有预编译的wheel,需要从源码编译。如果编译失败,别硬扛,换个替代方案。
- 性能测试要多次运行:JIT预热需要时间,至少跑3-5次取平均值。我一般会先跑一次“热身”,再正式记录数据。
好了,安装好PyPy,跑通第一个程序,你就已经迈出了JIT优化的第一步。下一章,我们会深入JIT的工作原理,看看它到底是怎么让代码飞起来的。
公众号:蓝海资料掘金营,微信deep3321