【AI翻译】Python 3.14来了,有多快?

标题:Python 3.14来了,有多快?

原文链接:https://blog.miguelgrinberg.com/post/python-3-14-is-here-how-fast-is-it

Markdown内容:
2024年11月,我写过一篇博客,标题为《Python真的那么慢吗?》,其中测试了多个Python版本,并指出随着时间的推移,Python的性能取得了稳定的进步。

今天是2025年10月8日,Python 3.14刚刚正式发布一天。让我们重新运行基准测试,看看新版本的Python有多快!

注意:如果你对结果表格和图表没兴趣,只想看结论,点这里直达文章尾部。

关于基准测试的片面性

虽然我会分享我的基准测试结果,但我必须再次提醒大家,就像我之前文章里说的,这类通用基准测试其实参考价值有限。跑这些基准测试其实更多是出于兴趣,不过仅凭几个简单的小脚本,很难准确反映Python解释器这种复杂系统的真实性能。

我设计的所有测试都只运行纯Python代码,避免使用任何依赖库,尤其是那些用C语言编写的函数。因为与Python本身相比,原生代码(除了解释器自身)从新版本中获得的性能提升非常有限,因此我没把它们纳入基准测试。但现实中的应用通常会混合使用纯Python和原生代码,比如C、C++或Rust等。所以我的测试脚本很适合评估纯Python的性能,但不能代表我们日常使用的真实应用。

简而言之,可以看看我的基准测试,但请把它只当做一个数据点,而不是Python性能的终极结论!

测试矩阵

以下是本次测试涉及的五个维度:

  • 6个Python版本,以及Pypy、Node.js和Rust的最新版本:

  • 3种Python解释器

    • 标准版
    • 即时编译(JIT):仅限CPython 3.13及以上
    • 自由线程(FT):仅限CPython 3.13及以上
  • 2个测试脚本

  • 2种线程模式

    • 单线程
    • 4个线程独立运行
  • 2台电脑

    • Framework笔记本,Ubuntu Linux 24.04(Intel Core i5 CPU)
    • Mac笔记本,macOS Sequoia(M2 CPU)

你也许觉得,在基准测试中加入Node.js和Rust有些奇怪。其实我将两个Python测试应用分别移植到了JavaScript和Rust中,用来作为参考,对比Python生态之外的表现。

测试脚本

下面是_fibo.py_的主要逻辑:

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

实验后我发现,用这段函数计算第40个斐波那契数,大约需要几秒钟,因此我选择此参数进行所有测试并汇总下述结果。

下面是_bubble.py_中的排序函数:

def bubble(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

同样,我选择能让脚本运行几秒钟的数组大小,最终定为10000个随机数。

请不要以为这些函数本身写得很高效,它们并不是性能最佳范例。这里的目标不是让函数尽可能快,而是比较不同Python解释器的表现。一份递归(fibo),一份非递归(bubble),两种风格,有助于测试多元性。

我自制的测试框架会每个函数运行三次,并取平均值。所有完整脚本和基准代码都已开放:GitHub仓库

基准测试1:单线程Fibonacci

首先来看第一个测试。这里测量的是运行fibo(40)所用的秒数。如前所述,每一组数据我都会运行三次取平均。

结果表格如下:

fibo 单线程 Linux macOS 对比3.14
3.9 15.21 13.81 0.45x
3.10 16.24 14.97 0.42x
3.11 9.11 9.23 0.71x
3.12 8.01 8.54 0.78x
3.13 8.26 8.24 0.79x
3.14 6.59 6.39 --
Pypy 3.11 1.39 1.24 4.93x
Node 24 1.38 1.28 4.88x
Rust 1.90 0.08 0.10 69.82x

最右侧一列是相较于3.14的速度倍率,低于1说明比3.14慢,高于1则更快。这一倍率取Linux和macOS结果的平均值。

有时用图表也许更直观,下图展示上述数据:

图片 1: fibo 单线程

这些结果说明了什么?我们可以看到,3.14相比3.13速度提升明显——提升约27%,换句话说,3.13的速度约为3.14的79%。此外,3.11是Python正式迈入“不是那么慢”的分水岭。

还有一点让我震惊的是Pypy。这个测试中Pypy略快于Node.js,且几乎比3.14快5倍。令人印象深刻,尽管与Rust相比还差不少,Rust如预期那样“碾压众生”。

JIT与自由线程变体

从Python 3.13开始,CPython有三种模式:标准版、自由线程(FT)、即时编译(JIT)。自由线程移除了全局解释器锁(GIL),理论上能大幅提升多线程程序,JIT则是在运行时将部分代码编译为本地代码以加速执行。

我上面的3.13与3.14数据均为标准解释器,但我也测试了其他两种。下表为这三种模式的比较:

fibo 单线程 Linux macOS 对比3.14
3.13 8.26 8.24 0.79x
3.13 JIT 8.26 8.28 0.78x
3.13 FT 12.40 12.40 0.52x
3.14 6.59 6.39 --
3.14 JIT 6.59 6.37 1.00x
3.14 FT 7.05 7.27 0.91x

图片 2: fibo 单线程 - 三种解释器

令人略感失望的是,在本测试中,JIT解释器几乎没带来明显提升。我反复确认使用了带JIT特性的正确版本。我不太了解新JIT的细节,不排除它难以优化这种递归较重的函数。

自由线程的情况,同去年一样,单线程下表现偏慢。这次3.14中自由线程版仍稍慢于标准版,但差距仅为标准版的91%。

基准测试2:单线程冒泡排序

下面是对10000个随机数做冒泡排序的单线程测试结果:

bubble 单线程 Linux macOS 对比3.14
3.9 3.77 3.29 0.60x
3.10 4.01 3.38 0.57x
3.11 2.48 2.15 0.91x
3.12 2.69 2.46 0.82x
3.13 2.82 2.61 0.78x
3.14 2.18 2.05 --
Pypy 3.11 0.10 0.14 18.14x
Node 24 0.43 0.21 6.64x
Rust 1.90 0.04 0.07 36.15x

图片 3: bubble 单线程

这次测试显示,我的Mac运行比Linux略快,但各版本之间比例基本一致。差异主要反映在不同电脑上,而Python自身提升幅度如出一辙。

3.14依然是CPython里最快的,但提升幅度比Fibonacci测试略小,3.11为3.14的91%。有趣的是,3.12与3.13反而比3.11慢,这也是去年就注意到的。

Pypy本次快18倍,甚至比Node快3倍。我真的很想深入研究Pypy的表现,实在令人惊艳。

JIT与自由线程变体

再来看看3.13和3.14专用解释器下冒泡排序的数据:

bubble 单线程 Linux macOS 对比3.14
3.13 2.82 2.61 0.78x
3.13 JIT 2.59 2.44 0.84x
3.13 FT 4.13 3.75 0.54x
3.14 2.18 2.05 --
3.14 JIT 2.03 2.32 0.97x
3.14 FT 2.66 2.28 0.86x

图片 4: bubble 单线程 - 三种解释器

JIT模式在Linux下略快,Mac下在3.13版本有提升,但3.14却略慢。整体速度差异很小,说明JIT还有很大的进步空间。我的代码似乎难以在JIT编译下获得显著收益。

自由线程模式也慢于标准版,但在3.14里已经比3.13进步了,与前面的Fibonacci测试保持一致。目前来看,常规场景下还不适合直接用自由线程,除非你在意GIL,且是极度多线程CPU密集型任务。

基准测试3:多线程Fibonacci

今年我引入了多线程版本(主要是给自由线程解释器一个发挥空间)。

多线程Fibonacci的做法是启动4个线程,各自独立计算第40个斐波那契数。两台笔记本都有4核以上,可以充分并行。计时时间从第一个线程启动到全部线程结束。

下表是标准解释器下用4线程运行_fibo.py_的结果:

fibo 4线程 Linux macOS 对比3.14
3.9 67.87 57.51 0.46x
3.10 72.42 61.57 0.43x
3.11 45.83 36.98 0.70x
3.12 36.22 34.13 0.82x
3.13 37.20 33.53 0.81x
3.14 32.60 24.96 --
Pypy 3.11 7.49 6.84 4.02x

图片 5: fibo 4线程

由于此测试更关注Python的GIL,所以没有运行Node或Rust。

当然,这些结果并没带来太多新信息。整体上Mac还是比Linux快,各版本与单线程基本线性增加:比如单线程Fibonacci约7秒,此处Mac为25秒,Linux为32秒,大致就是4倍时间。这很合理,因为GIL限制了Python代码的并行。

再来看3.13和3.14各解释器详细结果:

fibo 4线程 Linux macOS 对比3.14
3.13 37.20 33.53 0.81x
3.13 JIT 37.48 33.36 0.81x
3.13 FT 21.14 15.47 1.57x
3.14 32.60 24.96 --
3.14 JIT 32.58 24.90 1.00x
3.14 FT 10.80 7.81 3.09x

图片 6: fibo 4线程 - 三种解释器

这就令人兴奋了!

如预期,JIT模式没明显提升,可以无视。自由线程却充分展示了去除GIL后对多线程CPU密集任务的强大提升。

在3.13里,FT模式比标准版提升约2.2倍,在3.14里提升到3.1倍。这太令人振奋了!

基准测试4:多线程冒泡排序

最后来看4线程下的冒泡排序。每个线程分别排序一万个随机数,数组内容相同但互不干扰。

先看标准解释器结果:

bubble 4线程 Linux macOS 对比3.14
3.9 16.14 12.58 0.66x
3.10 16.12 12.95 0.65x
3.11 11.43 7.89 0.97x
3.12 11.39 9.01 0.92x
3.13 11.54 9.78 0.88x
3.14 10.55 8.27 --
Pypy 3.11 0.54 0.59 16.65x

图片 7: bubble 4线程

无需多说,单线程测试大约2秒,4线程大致是10秒(Linux)和8秒(Mac)。有趣的是Linux略高于4倍,说明这台电脑的性能瓶颈更明显。

再来看3.13/3.14新解释器下的表现:

bubble 4线程 Linux macOS 对比3.14
3.13 11.54 9.78 0.88x
3.13 JIT 10.90 9.19 0.94x
3.13 FT 9.83 5.05 1.17x
3.14 10.55 8.27 --
3.14 JIT 10.03 9.26 0.98x
3.14 FT 6.23 3.02 2.03x

图片 8: bubble 4线程 - 三种解释器

这里再次证明自由线程的价值。Mac上的FT模式表现比Linux更突出,平均来看3.14 FT比标准版快约2倍。如果你的多线程程序极度依赖CPU,FT解释器值得考虑。

而JIT在Mac下反而比标准还慢,这与之前单线程测试一致。我猜并不是偶然。但反正这些细微差异并不大,更期待JIT未来持续优化。

结论

希望你觉得我的基准测试有趣。总结如下:

  • CPython 3.14可以说是目前所有CPython中最快的;
  • 如果暂时无法升级到3.14,至少用3.11及以上吧,因为3.11之后提升巨大;
  • 3.14的JIT解释器暂时看不出太大加速效果,至少对我的测试脚本如此;
  • 3.14自由线程解释器在多线程CPU密集场景比标准解释器快,值得一试。但其它常规工作负载我不推荐使用,因为非GIL瓶颈场景下还是慢一些;
  • Pypy真的非常快!

你测试过Python 3.14的性能吗?欢迎留言分享你的结果。

感谢浏览我的博客!如果本篇对你有帮助,欢迎通过Buy me a coffee请我喝一杯咖啡支持我。谢谢!

posted @ 2025-10-15 15:29  ffl  阅读(158)  评论(0)    收藏  举报