标题: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的最新版本:
- CPython 3.9、3.10、3.11、3.12、3.13、3.14
- Pypy 3.11
- Node 24
- Rust 1.90
- 3种Python解释器
- 标准版
- 即时编译(JIT):仅限CPython 3.13及以上
- 自由线程(FT):仅限CPython 3.13及以上
- 2个测试脚本
- fibo.py:计算Fibonacci数列,大量递归
- bubble.py:用bubble sort冒泡排序对随机数组排序,主要迭代,无递归
- 2种线程模式
- 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)
复制代码 同样,我选择能让脚本运行几秒钟的数组大小,最终定为10000个随机数。
请不要以为这些函数本身写得很高效,它们并不是性能最佳范例。这里的目标不是让函数尽可能快,而是比较不同Python解释器的表现。一份递归(fibo),一份非递归(bubble),两种风格,有助于测试多元性。
我自制的测试框架会每个函数运行三次,并取平均值。所有完整脚本和基准代码都已开放:GitHub仓库。
基准测试1:单线程Fibonacci
首先来看第一个测试。这里测量的是运行fibo(40)所用的秒数。如前所述,每一组数据我都会运行三次取平均。
结果表格如下:
fibo 单线程LinuxmacOS对比3.143.915.2113.810.45x3.1016.2414.970.42x3.119.119.230.71x3.128.018.540.78x3.138.268.240.79x3.146.596.39--Pypy 3.111.391.244.93xNode 241.381.284.88xRust 1.900.080.1069.82x最右侧一列是相较于3.14的速度倍率,低于1说明比3.14慢,高于1则更快。这一倍率取Linux和macOS结果的平均值。
有时用图表也许更直观,下图展示上述数据:
这些结果说明了什么?我们可以看到,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 单线程LinuxmacOS对比3.143.138.268.240.79x3.13 JIT8.268.280.78x3.13 FT12.4012.400.52x3.146.596.39--3.14 JIT6.596.371.00x3.14 FT7.057.270.91x
令人略感失望的是,在本测试中,JIT解释器几乎没带来明显提升。我反复确认使用了带JIT特性的正确版本。我不太了解新JIT的细节,不排除它难以优化这种递归较重的函数。
自由线程的情况,同去年一样,单线程下表现偏慢。这次3.14中自由线程版仍稍慢于标准版,但差距仅为标准版的91%。
基准测试2:单线程冒泡排序
下面是对10000个随机数做冒泡排序的单线程测试结果:
bubble 单线程LinuxmacOS对比3.143.93.773.290.60x3.104.013.380.57x3.112.482.150.91x3.122.692.460.82x3.132.822.610.78x3.142.182.05--Pypy 3.110.100.1418.14xNode 240.430.216.64xRust 1.900.040.0736.15x
这次测试显示,我的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 单线程LinuxmacOS对比3.143.132.822.610.78x3.13 JIT2.592.440.84x3.13 FT4.133.750.54x3.142.182.05--3.14 JIT2.032.320.97x3.14 FT2.662.280.86x
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线程LinuxmacOS对比3.143.967.8757.510.46x3.1072.4261.570.43x3.1145.8336.980.70x3.1236.2234.130.82x3.1337.2033.530.81x3.1432.6024.96--Pypy 3.117.496.844.02x
由于此测试更关注Python的GIL,所以没有运行Node或Rust。
当然,这些结果并没带来太多新信息。整体上Mac还是比Linux快,各版本与单线程基本线性增加:比如单线程Fibonacci约7秒,此处Mac为25秒,Linux为32秒,大致就是4倍时间。这很合理,因为GIL限制了Python代码的并行。
再来看3.13和3.14各解释器详细结果:
fibo 4线程LinuxmacOS对比3.143.1337.2033.530.81x3.13 JIT37.4833.360.81x3.13 FT21.1415.471.57x3.1432.6024.96--3.14 JIT32.5824.901.00x3.14 FT10.807.813.09x
这就令人兴奋了!
如预期,JIT模式没明显提升,可以无视。自由线程却充分展示了去除GIL后对多线程CPU密集任务的强大提升。
在3.13里,FT模式比标准版提升约2.2倍,在3.14里提升到3.1倍。这太令人振奋了!
基准测试4:多线程冒泡排序
最后来看4线程下的冒泡排序。每个线程分别排序一万个随机数,数组内容相同但互不干扰。
先看标准解释器结果:
bubble 4线程LinuxmacOS对比3.143.916.1412.580.66x3.1016.1212.950.65x3.1111.437.890.97x3.1211.399.010.92x3.1311.549.780.88x3.1410.558.27--Pypy 3.110.540.5916.65x
无需多说,单线程测试大约2秒,4线程大致是10秒(Linux)和8秒(Mac)。有趣的是Linux略高于4倍,说明这台电脑的性能瓶颈更明显。
再来看3.13/3.14新解释器下的表现:
bubble 4线程LinuxmacOS对比3.143.1311.549.780.88x3.13 JIT10.909.190.94x3.13 FT9.835.051.17x3.1410.558.27--3.14 JIT10.039.260.98x3.14 FT6.233.022.03x
这里再次证明自由线程的价值。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请我喝一杯咖啡支持我。谢谢!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|
|
|
相关推荐
|
|