Python 3.11比 3.8快三倍


Python 是一种流行但广受好评的解释性语言。它在性能方面取得了长足进步,最新版本显示我的系统显着加速。
在 M1 Pro 上运行,我尝试了一些跨 Python 3.8、3.11、Bun 和 C++17 (-O2) 的 N 体模拟代码。

对于此次测试,我运行了 1000 万步的 N 体模拟。(Python源代码)

$ time python3.8 sim.py 10000000
-0.169075164
-0.169077842
python3.8 sim.py 10000000  96.07s user 0.63s system 99% cpu 1:36.79 total

Python 3.8 耗时96.79 秒。

$ time python3.11 sim.py 10000000
-0.169075164
-0.169077842
python3.11 sim.py 10000000  31.92s user 0.05s system 99% cpu 31.976 total

Python 3.11 只用了31.98 秒!
快了 3 倍!

JavaScript
JavaScript 是语言性能的良好基准。就像 Python 一样,它是一种灵活的动态类型脚本语言,可以在终端中运行,并且拥有完善的 C-API。

在这个比较中,JavaScript 并不完全是失败者。它比 Python更受欢迎 且速度更快。

但到底快了多少?(JavaScript 源代码)

$ time bun sim.ts 10000000
-0.169075164
-0.169077842
bun sim.ts 10000000  0.76s user 0.01s system 100% cpu 0.768 total

Bun 运行模拟耗时0.768 秒,比 Python 3.11 快 41 倍
对于任何熟悉 JavaScript 的人来说,这几乎是意料之中的。它是一种 JIT 编译语言,具有更多的投资和多个竞争性运行时。

C++17
C++ 是一种编译语言,这意味着它缺乏 Python 和 JavaScript 的一些便利性。除了严格的类型和通常难看的语法外,C++ 还需要提前编译。

使用 -O2 编译 C++ 代码需要0.183 秒。(C++源代码)

$ time g++ -O2 -std=c++17 sim.cc -o sim
g++ -O2 -std=c++17 sim.cc -o sim  0.11s user 0.03s system 76% cpu 0.183 total

然后,运行二进制

$ time ./sim 10000000
-0.169075164
-0.169077842
./sim 10000000  0.42s user 0.00s system 99% cpu 0.423 total

C++ 运行仿真需要0.423 秒,比 JavaScript 快 1.8 倍
对我来说,这个数字代表了像 Python 这样的语言可以达到的“峰值”性能。

JIT 编译语言理论上可以击败编译语言。据我所知,这在实践中并没有真正发生过。