Python文档:3.13 - experimental-jit
实验性的即时 (JIT) 编译器 
 
当 CPython 使用 --enable-experimental-jit 选项进行配置和构建时,会添加一个即时(JIT)编译器以加快某些 Python 程序的运行速度。 在 Windows 上,可使用 PCbuild/build.bat --experimental-jit 启用 JIT 或使用 --experimental-jit-interpreter 启用第 2 层级解释器。 构建要求和进一步的支持信息 包含在 Tools/jit/README.md 中。 
 
--enable-experimental-jit 选项接受这些(可选)值,如果不带可选值地预设 --enable-experimental-jit 则默认为 yes。 
 
no: 禁用整个第 2 层级和 JIT 管线。 
yes: 启用 JIT。 要在运行时禁用 JIT,则传入环境变量 PYTHON_JIT=0。 
yes-off: 构建 JIT 但默认禁用它。 要在运行时启用 JIT,则传入环境变量 PYTHON_JIT=1。 
interpreter: 启用第 2 层级解释器但是禁用 JIT。 可以在运行时传入 PYTHON_JIT=0 来禁用该解释器。 
 
其内部架构大致如下: 
 
- 我们将从特化的 第 1 层级字节码 开始。 请参阅 3.11 有什么新变化 了解详情。 
- 当第 1 层级字节码达到足够热度,它将被翻译为新的纯内部的中间表示形式 (IR),称为 第 2 层级 IR,有时也称为微操作码 ("uops")。 
- 第 2 层级 IR 使用与第 1 层级相同的基于栈的虚拟机,但其指令格式更适合被翻译为机器码。 
- 在第 2 层级 IR 被解释或翻译为机器码之前,我们会预先应用一些优化通路。 
- 虽然第 2 层级解释器存在,但它主要用于对优化管线的先前阶段进行调试。可通过为 Python 配置 --enable-experimental-jit=interpreter 选项启用第 2 层级解释器。 
- 启用 JIT 时,经优化的第 2 层级 IR 将被翻译为机器码后再执行。 
- 这个机器码翻译过程使用了名为 拷贝并打补丁 的技巧。 它没有运行时依赖,但增加了构建时对 LLVM 的依赖。 
 
 
 
PEP 659:专门化自适应解释器 
 
PEP 659 是 Faster CPython 项目的关键部分之一。 基本理念在于虽然 Python 是一种动态语言,但大部分代码都存在对象和类型极少发生变化的区域。 这一理念被称为 类型稳定性。 
 
在运行时,Python 将尝试在所执行的代码中寻找常见模式和类型稳定性。 然后 Python 将把当前的操作替换为更加专门化的操作。 这种专门化的操作使用仅对这些应用场景/类型来说可用的快速路径,它们的性能通常都会超过其泛用型的对应物。 这还带来了名为 内联缓存 的另一项理念,即 Python 会将高消耗的操作的结果直接缓存在 bytecode 中。 
 
这个特化程序还会将特定的常见指令对合并为一条“超级指令”,减少执行期间的开销。 
 
Python 将只特化(会被多次执行的)“热门”代码。 这可以防止 Python 在只执行一次的代码上浪费时间。 Python 还可以在代码过于动态或用法发生变化时取消特化。 特化会定期地尝试,而特化尝试的开销也不高,这使得特化能够适应新的环境改变。 
2024-11-09
浏览46
登录后评论
3
分享