Python 3.13 JIT仅加速纯Python热点函数,对NumPy等C扩展无效;它在函数调用超50次后动态编译为x86-64机器码,首次调用仍解释执行,且仅支持x86-64平台。

Python 3.13 JIT 只对“纯 Python 热点函数”生效
它不加速 numpy、requests 或任何调用 C 扩展的代码——那些逻辑早就在机器码里跑了。JIT 的作用对象是解释器自己反复执行的字节码,比如手写的循环、递归、数值累加等。一旦某函数被调用超过默认阈值(当前是 50 次),CPython 就把它标记为热点,后续调用就跳过解释器调度,直接执行编译后的 x86-64 机器码。
- 典型有效场景:
for i in range(10**6): total += i * i、斐波那契递归、自定义矩阵乘法 - 无效场景:
np.dot(a, b)、json.loads()、sqlite3.execute() - 注意:即使函数里混了少量 C 调用(如
math.sqrt()),只要主体是 Python 循环,仍可能被 JIT 编译,但优化效果会打折扣
-X jit 和 PYTHON_JIT=1 的行为差异
两者都能启用 JIT,但触发时机和调试能力不同:
-
python -X jit script.py:启动时全局启用,且支持附加调试参数,例如-X jit_dump输出编译日志,-X jit-log-level=INFO查看哪些函数被编译 -
PYTHON_JIT=1 python script.py:仅控制是否开启 JIT 前端,不提供日志输出能力,适合脚本部署 - 二者不能同时使用;若都设置,
-X jit优先级更高 - 调试时建议用
-X jit -X jit_dump,看到类似jit: compiled 'compute_heavy_loop' (32 bytes)才算真正生效
JIT 编译不是“全量翻译”,而是按需替换
它不会在启动时把整个脚本编译掉,而是在运行中动态决定——只编译那些被高频执行的函数体,且只编译一次,结果缓存。这意味着:
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 首次调用仍走解释器,有冷启动延迟;第 51 次起才切换到机器码
- 函数内嵌套调用其他函数时,被调用方若未达阈值,仍被解释执行(JIT 不递归穿透)
- 含
eval()、exec()、动态属性访问(如getattr(obj, name))的函数基本不会被 JIT 编译,因为无法静态分析控制流 - 修改函数源码后重启进程才能重新触发编译——没有热重载
ARM 支持尚未落地,x86-64 是唯一稳定平台
截至 2026 年 6 月,Python 3.13 官方构建版的 JIT 编译器只生成 x86-64 指令。在 Apple Silicon(M1/M2/M3)或树莓派上运行 -X jit 不报错,但实际不编译任何函数——sys.jit_status() 会返回 {'enabled': True, 'backend': 'none'}。
立即学习“Python免费学习笔记(深入)”;
- 如果你在 macOS ARM64 上测不出性能提升,不是配置错了,是 JIT 根本没工作
- Linux x86-64 和 Windows x64 是目前唯一能实测到加速的环境
- 官方文档明确标注 “ARM64 support is experimental and disabled by default”
JIT 的提速本质是绕过解释器循环调度开销,但它依赖稳定的控制流和可预测的数据类型。写得太“Pythonic”(比如大量 isinstance 分支、混合类型运算)反而会让 JIT 放弃编译——它不是万能加速器,而是针对特定模式的专用优化器。

















