Python 提速 20%,来看看 Python 3.15 中的新特性

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 是关闭的,毕竟它还是个实验性功能,需要手动开启。

启用方式很简单:设置环境变量 PYTHON_JIT=1。你可以:

  • 临时在当前 shell 会话中设置:

    sh 复制代码
    export PYTHON_JIT=1
    python your_script.py
  • 或者直接在命令行前缀启动:

    sh 复制代码
    PYTHON_JIT=1 python your_script.py

Python 启动时会检查 PYTHON_JIT 环境变量:只要值为 1,JIT 就会被激活;否则保持关闭。

虽然你可以把 PYTHON_JIT=1 写进系统环境变量长期生效,但更推荐按需启用------比如只在跑性能敏感任务时临时打开,避免对其他脚本产生意外影响。

如何确认 JIT 是否生效?

从 Python 3.13 开始,标准库的 sys 模块新增了一个内部命名空间:sys._jit。它提供了三个实用函数,返回值都是 TrueFalse

  • 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 加速效果实测:哪些代码能受益?

由于 JIT 仍处于早期阶段,目前没有公开 API 能告诉你哪段函数被编译了,也无法直接查看优化状态。唯一靠谱的方法就是写 benchmark,对比开启/关闭 JIT 时的运行时间。

✅ 正面案例:Mandelbrot 分形计算

下面这段代码实现了一个简化版的 Mandelbrot 集合渲染:

python 复制代码
from time import perf_counter
import sys

print("JIT enabled:", sys._jit.is_enabled())

WIDTH = 80
HEIGHT = 40
X_MIN, X_MAX = -2.0, 1.0
Y_MIN, Y_MAX = -1.0, 1.0
ITERS = 500

YM = (Y_MAX - Y_MIN)
XM = (X_MAX - X_MIN)

def iter_(c):
    z = 0j
    for _ in range(ITERS):
        if abs(z) > 2.0:
            return False
        z = z ** 2 + c
    return True

def generate():
    start = perf_counter()
    output = []

    for y in range(HEIGHT):
        cy = Y_MIN + (y / HEIGHT) * YM
        for 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 output

print("".join(generate()))

运行后,程序会先打印 JIT 状态,再输出 ASCII 分形图和耗时。

实测发现:开启 JIT 后,运行时间稳定减少约 20% 。如果你感觉提速不明显,可以试着调高 ITERS(比如设为 2000),让计算量更大,加速效果就会更突出。

❌ 反面案例:递归斐波那契

再看一个反例------经典的递归斐波那契实现:

python 复制代码
import sys
print("JIT enabled:", sys._jit.is_enabled())
from time import perf_counter

def fib(n):
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

def main():
    start = perf_counter()
    result = fib(36)
    print(perf_counter() - start)

main()

截至 Python 3.15a3JIT 对这段代码几乎没有加速效果

你可能会想:"是不是因为递归太深,JIT 不擅长处理?"但实测表明,即使改成循环版本,性能提升依然微乎其微。这说明当前 JIT 的优化策略对这类算法尚未覆盖,或者触发条件不满足。

使用建议:谨慎尝鲜,切勿冒进

虽然 JIT 很有潜力,但它仍是实验性功能。对待它的态度,应该和"无线程构建"或"无 GIL 模式"一样:可以测试,但别急着上生产

你可以:

  • 在自己的项目中开启 JIT,看看特定 workload 是否受益;
  • 结合 perf_counter() 做 A/B 测试,量化实际收益;
  • 关注后续 Python 版本的 JIT 改进。

但务必注意:JIT 的行为在未来版本中可能发生变化。今天跑得快的代码,明天可能变慢;反之亦然。稳定性尚无法保证。

总结

Python 原生 JIT 虽然还在襁褓之中,但已经展现出令人期待的潜力。随着 3.15 及后续版本的演进,我们有望看到更智能的编译策略、更广的适用场景,以及真正"开箱即用"的 Python 性能飞跃。现在,正是参与测试、反馈问题的好时机。

原文
www.infoworld.com/article/411...

相关推荐
3824278272 小时前
python3网络爬虫开发实战 第2版:并发限制
开发语言·爬虫·python
爱敲代码的TOM2 小时前
PythonWeb基础-FastAPI使用
python·fastapi
星川皆无恙2 小时前
从“盲人摸象“到“全面感知“:多模态学习的进化之路
大数据·人工智能·python·深度学习·学习
木卫二号Coding2 小时前
pip库备份方法
chrome·python·pip
落叶,听雪2 小时前
河南AI建站选哪家
人工智能·python
talenteddriver2 小时前
web: jwt令牌构成、创建的基本流程及原理
java·开发语言·python·网络协议·web
小北方城市网2 小时前
解析GEO:定义、价值与忽视的代价
python·ai·geo
胡伯来了2 小时前
08 - 数据收集 - 网页采集工具Selenium
爬虫·python·selenium·rag·网络采集
沃斯堡&蓝鸟2 小时前
DAY31 函数专题2:装饰器
python