Python 3.13 的 JIT 是仅限源码编译、需显式启用 --with-jit 且依赖 LLVM 的实验性特性,不包含在官方二进制包中,无运行时开关或 API,仅对极少数纯 Python 字节码模式做模板化加速,不具备通用优化能力。

copy-and-patch 不是用户可启用的开关,也不是运行时能调用的 API。Python 3.13 中的 JIT 编译器目前仅作为实验性构建选项存在,普通 pip 安装或官方二进制包里根本没它。
Python 3.13 的 JIT 不是开箱即用的功能
你执行 python --version 或 sys.version 看到 3.13.x,不代表 JIT 已激活。它只存在于从源码手动编译、且显式启用 --with-jit 配置参数的 CPython 构建中。官方预编译包(Windows/macOS/Linux 各平台 .tar.gz/.exe/.pkg)全部不含 JIT 支持。
- 必须在 Linux/macOS 上安装 LLVM 工具链(
clang、llvm-objdump等),否则configure阶段直接报错 -
make过程会额外调用clang -O3编译 JIT 模板,耗时明显增加 - 生成的解释器二进制里没有
sys._enable_jit()或类似接口 —— JIT 行为完全由字节码执行路径内部触发,不可控、不可观测
copy-and-patch 的实际作用范围非常有限
当前实现只针对极少数高频字节码模式做模板化加速,比如 LOAD_FAST + BINARY_ADD 连续出现的简单循环体。它不处理函数调用、属性访问、异常控制流,也不优化任何涉及 __getattr__ 或描述符逻辑的代码。
- 对 NumPy/Pandas/PyTorch 等 C 扩展密集型场景无加速效果 —— JIT 只作用于纯 Python 字节码层
- 无法加速
for x in range(1000000): total += x这类典型循环,因为range迭代器本身触发的是 C 层逻辑,绕过字节码解释器 - 即使命中模板,补丁过程也只发生在第一次执行该代码块时,后续仍走 patched 机器码;但若对象类型变化(如 int → float),会退回到解释器路径,不自动重编译
别把它和 PyPy 或 Numba 混为一谈
这个 JIT 不提供 @jit 装饰器,不支持类型提示引导优化,也不做跨函数内联或逃逸分析。它的定位是「解释器内部的微加速补丁」,而非独立编译管道。
- PyPy 的 JIT 是运行时持续跟踪热点并生成完整机器码,可跨调用栈优化;
copy-and-patch只做单基本块字节码序列的模板替换 - Numba 需要显式标注、依赖 LLVM 全流程编译;而 Python 3.13 的 JIT 在构建时就固化了模板,运行时不依赖外部 LLVM 运行时
- 目前没有任何方式通过环境变量(如
PYTHONJIT=1)或命令行参数开启或配置它 —— 它要么编译进解释器,要么就没有
CALL 相关字节码),现有模板就会失效,甚至引发未定义行为 —— 它不是为长期兼容设计的,而是紧贴当前字节码规范的“快照式”优化。


















