
Python 3.15 引入了原生的即时编译器(JIT),在部分场景下可带来 20% 甚至更高的性能提升------尽管目前它仍处于实验阶段。
所谓 JIT(Just-In-Time Compilation,即时编译),就是让原本"解释执行"的 Python 代码在运行时动态编译成机器码,从而显著提速。过去,这类能力只能依赖第三方方案,比如 Numba 这样的库,或者使用 PyPy 这类替代性 Python 解释器。
如今,Python 官方终于把 JIT 编译器集成进了主干。虽然早期版本效果有限,但到了 Python 3.15(当前仍处于 alpha 阶段,尚未正式发布),核心开发团队做了大量优化,使得 JIT 在某些计算密集型任务中已经能带来可观的加速。
当然,JIT 的提速效果因 workload 而异:有些程序飞快,有些则几乎没变化。不过好消息是,现在的 JIT 已经足够稳定,开发者完全可以拿来试试水,甚至在可控环境下用于生产测试。
如何启用 Python JIT?
默认情况下,Python 的原生 JIT 是关闭的,毕竟它还是个实验性功能,需要手动开启。
启用方式很简单:设置环境变量 PYTHON_JIT=1。你可以:
-
临时在当前 shell 会话中设置:
shexport PYTHON_JIT=1 python your_script.py -
或者直接在命令行前缀启动:
shPYTHON_JIT=1 python your_script.py
Python 启动时会检查 PYTHON_JIT 环境变量:只要值为 1,JIT 就会被激活;否则保持关闭。
虽然你可以把 PYTHON_JIT=1 写进系统环境变量长期生效,但更推荐按需启用------比如只在跑性能敏感任务时临时打开,避免对其他脚本产生意外影响。
如何确认 JIT 是否生效?
从 Python 3.13 开始,标准库的 sys 模块新增了一个内部命名空间:sys._jit。它提供了三个实用函数,返回值都是 True 或 False:
sys._jit.is_available():判断当前 Python 构建是否支持 JIT。官方发布的大多数二进制包都包含 JIT 支持,但像"无线程"(freethreading)或"无 GIL"等特殊构建可能不包含。sys._jit.is_enabled():检查 JIT 是否已启用。注意,这仅表示 JIT 功能打开了,并不代表你的代码已经被编译。sys._jit.is_active():尝试判断当前栈顶帧是否正在执行 JIT 编译后的代码。但这个接口不太可靠 ------你的程序可能不小心进入了"冷路径"(即未被 JIT 优化的代码分支)。因此,最靠谱的方式还是通过实际性能对比来验证效果。
日常使用中,sys._jit.is_enabled() 是最有用的,能快速确认 JIT 是否已成功开启。
JIT 加速效果实测:哪些代码能受益?
由于 JIT 仍处于早期阶段,目前没有公开 API 能告诉你哪段函数被编译了,也无法直接查看优化状态。唯一靠谱的方法就是写 benchmark,对比开启/关闭 JIT 时的运行时间。
✅ 正面案例:Mandelbrot 分形计算
下面这段代码实现了一个简化版的 Mandelbrot 集合渲染:
python
from time import perf_counter
import sys
print("JIT enabled:", sys._jit.is_enabled())
WIDTH = 80
HEIGHT = 40
X_MIN, X_MAX = -2.0, 1.0
Y_MIN, Y_MAX = -1.0, 1.0
ITERS = 500
YM = (Y_MAX - Y_MIN)
XM = (X_MAX - X_MIN)
def iter_(c):
z = 0j
for _ in range(ITERS):
if abs(z) > 2.0:
return False
z = z ** 2 + c
return True
def generate():
start = perf_counter()
output = []
for y in range(HEIGHT):
cy = Y_MIN + (y / HEIGHT) * YM
for x in range(WIDTH):
cx = X_MIN + (x / WIDTH) * XM
c = complex(cx, cy)
output.append("*" if iter_(c) else ".")
output.append("\n")
print("Time:", perf_counter() - start)
return output
print("".join(generate()))
运行后,程序会先打印 JIT 状态,再输出 ASCII 分形图和耗时。
实测发现:开启 JIT 后,运行时间稳定减少约 20% 。如果你感觉提速不明显,可以试着调高 ITERS(比如设为 2000),让计算量更大,加速效果就会更突出。
❌ 反面案例:递归斐波那契
再看一个反例------经典的递归斐波那契实现:
python
import sys
print("JIT enabled:", sys._jit.is_enabled())
from time import perf_counter
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
def main():
start = perf_counter()
result = fib(36)
print(perf_counter() - start)
main()
截至 Python 3.15a3,JIT 对这段代码几乎没有加速效果。
你可能会想:"是不是因为递归太深,JIT 不擅长处理?"但实测表明,即使改成循环版本,性能提升依然微乎其微。这说明当前 JIT 的优化策略对这类算法尚未覆盖,或者触发条件不满足。
使用建议:谨慎尝鲜,切勿冒进
虽然 JIT 很有潜力,但它仍是实验性功能。对待它的态度,应该和"无线程构建"或"无 GIL 模式"一样:可以测试,但别急着上生产。
你可以:
- 在自己的项目中开启 JIT,看看特定 workload 是否受益;
- 结合
perf_counter()做 A/B 测试,量化实际收益; - 关注后续 Python 版本的 JIT 改进。
但务必注意:JIT 的行为在未来版本中可能发生变化。今天跑得快的代码,明天可能变慢;反之亦然。稳定性尚无法保证。
总结
Python 原生 JIT 虽然还在襁褓之中,但已经展现出令人期待的潜力。随着 3.15 及后续版本的演进,我们有望看到更智能的编译策略、更广的适用场景,以及真正"开箱即用"的 Python 性能飞跃。现在,正是参与测试、反馈问题的好时机。