关注+星标,每天学习Python新技能
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=1。你可以:
临时在当前 shell 会话中设置:
export PYTHON_JIT=1python your_script.py或者直接在命令行前缀启动:
PYTHON_JIT=1 python your_script.pyPython 启动时会检查 PYTHON_JIT 环境变量:只要值为 1,JIT 就会被激活;否则保持关闭。
虽然你可以把 PYTHON_JIT=1 写进系统环境变量长期生效,但更推荐按需启用——比如只在跑性能敏感任务时临时打开,避免对其他脚本产生意外影响。
从 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 仍处于早期阶段,目前没有公开 API 能告诉你哪段函数被编译了,也无法直接查看优化状态。唯一靠谱的方法就是写 benchmark,对比开启/关闭 JIT 时的运行时间。
下面这段代码实现了一个简化版的 Mandelbrot 集合渲染:
from time import perf_counterimport sysprint("JIT enabled:", sys._jit.is_enabled())WIDTH = 80HEIGHT = 40X_MIN, X_MAX = -2.0, 1.0Y_MIN, Y_MAX = -1.0, 1.0ITERS = 500YM = (Y_MAX - Y_MIN)XM = (X_MAX - X_MIN)defiter_(c): z = 0jfor _ in range(ITERS):if abs(z) > 2.0:returnFalse z = z ** 2 + creturnTruedefgenerate(): start = perf_counter() output = []for y in range(HEIGHT): cy = Y_MIN + (y / HEIGHT) * YMfor 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 outputprint("".join(generate()))运行后,程序会先打印 JIT 状态,再输出 ASCII 分形图和耗时。
实测发现:开启 JIT 后,运行时间稳定减少约 20% 。如果你感觉提速不明显,可以试着调高 ITERS(比如设为 2000),让计算量更大,加速效果就会更突出。
再看一个反例——经典的递归斐波那契实现:
import sysprint("JIT enabled:", sys._jit.is_enabled())from time import perf_counterdeffib(n):if n <= 1:return nreturn fib(n-1) + fib(n-2)defmain(): start = perf_counter() result = fib(36) print(perf_counter() - start)main()截至 Python 3.15a3,JIT 对这段代码几乎没有加速效果。
你可能会想:“是不是因为递归太深,JIT 不擅长处理?”但实测表明,即使改成循环版本,性能提升依然微乎其微。这说明当前 JIT 的优化策略对这类算法尚未覆盖,或者触发条件不满足。
虽然 JIT 很有潜力,但它仍是实验性功能。对待它的态度,应该和“无线程构建”或“无 GIL 模式”一样:可以测试,但别急着上生产。
你可以:
perf_counter() 做 A/B 测试,量化实际收益;但务必注意:JIT 的行为在未来版本中可能发生变化。今天跑得快的代码,明天可能变慢;反之亦然。稳定性尚无法保证。
Python 原生 JIT 虽然还在襁褓之中,但已经展现出令人期待的潜力。随着 3.15 及后续版本的演进,我们有望看到更智能的编译策略、更广的适用场景,以及真正“开箱即用”的 Python 性能飞跃。现在,正是参与测试、反馈问题的好时机。

▲点击关注-免费领取
推荐阅读
Python 3.15 在 Windows x86-64 上的解释器有望提速 15%
PyCausalSim:基于模拟的因果发现的Python框架
从 Pandas 转向 Polars:新手常见的10 个问题与优化建议
点击 阅读原文