Python中新JIT功能介绍

💡 原文中文,约6300字,阅读约需15分钟。
📝

内容提要

2023年12月下旬,CPython核心开发人员Brandt Bucher向Python 3.13分支提交了一个添加JIT编译器的请求。JIT是一种按需编译的设计,可以在代码第一次运行时进行编译。初步基准测试显示性能提高了5-9%。

🔎

延伸解读

复制-补丁 JIT 的取舍

文章指出,复制-补丁 JIT 将字节码对应的机器码模板拼接并修补参数,实现比完整 JIT 更简单、内存占用更少。完整 JIT 需将字节码编译为中间语言再生成机器码,过程缓慢且内存开销大,例如基于 Java 的 Python JIT 启动时间可能长 100 倍。复制-补丁方案避免了在运行时运行复杂编译器架构,但优化机会有限,性能提升目前仅 5-9%。

当前 JIT 的触发条件与局限

根据文章,目前 JIT 仅在函数包含 JUMP_BACKWARD 操作码(用于 while 语句)时才会被使用,未来会改变。这意味着循环结构可能受益,但其他代码路径尚未覆盖。此外,JIT 需在编译 CPython 时通过 --enable-experimental-jit 标志启用,普通用户默认无法使用。初步基准测试显示性能提高 5-9%,但这是早期数据,实际效果可能因代码模式而异。

与 Python 3.11 自适应解释器的关系

文章将新 JIT 描述为自 Python 3.11 自适应解释器以来对 CPython 的最大更改之一,两者均来自 Brandt Bucher。自适应解释器是优化方向的一步,但文章认为 Python 需要走得更远才能实现性能阶跃变化。新 JIT 通过扩展 API 允许发现可插拔优化器,本身是可选优化器,未来可能成为默认。这显示 CPython 在保持解释器架构的同时,逐步引入更激进的优化手段。

❓

Q&A

Python 3.13 计划加入的 JIT 编译器是什么?

Python 3.13 计划加入的 JIT 编译器是一种按需编译的设计,在代码第一次运行时进行编译。它由 CPython 核心开发人员 Brandt Bucher 于 2023 年 12 月提交,是自 Python 3.11 以来对 CPython 解释器的最大更改之一。

Python 3.13 的 JIT 编译器采用什么技术?

它采用复制和补丁(copy-and-patch)JIT 技术。该技术将字节码转换为机器码模板,并在运行时填补参数,从而生成可执行的机器码。

复制和补丁 JIT 相比完整 JIT 有什么优点?

复制和补丁 JIT 实现更简单,内存占用更少。它不需要在运行时运行复杂的 JIT 编译器架构,只需在编译 CPython 时使用 LLVM 工具生成模板,避免了完整 JIT 编译成 IL 再编译成机器码的缓慢过程和大量内存消耗。

如何启用 Python 3.13 的实验性 JIT?

在从源代码编译 CPython 时,可以在 configure 脚本中提供 --enable-experimental-jit 标志来启用 JIT。

新的 JIT 编译器能带来多少性能提升?

初步基准测试显示性能提高了 5-9%。

新的 JIT 编译器目前有什么使用限制?

目前,只有在函数包含 JUMP_BACKWARD 操作码(用于 while 语句)时才会使用 JIT,但未来会改变。

🏷️

标签

➡️

继续阅读