摘要:10 月 24 日,Python 官方發佈了最新的 3.11 版本,來看看它與 Python 3.8、JavaScript 和 C++17 之間的速度對比。
連結:https://jott.live/markdown/py3.11_vs_3.8
聲明:本文為 CSDN 翻譯,未經允許禁止轉載。
作者 | Bram Wasti
譯者 | 彎月
我在 M1 Pro 上嘗試用 Python 3.8、3.11、Bun(JavaScript 運行時)和 C++17 (-O2) 運行了一段 N 體模擬程式碼。

Python
Python 是一種很流行且廣受好評的解釋性語言。最近,Python 在性能提升方面也有了很大進步,通過我的測試可以看出最新版本的速度有了明顯的提升。
在這個測試中,我運行了1000 萬步的 N 體模擬。(Python 源程式碼在這裡:https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-python3-1.html)
$ 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 是衡量程式語言性能的一個很好的基準。JavaScript 與 Python 一樣,是一種靈活的動態類型手稿語言,可以在終端中運行,而且擁有完善的 C API。
在此次測試中,JavaScript 的表現並不差,它的運行速度超過了 Python。
究竟有多快?(JavaScript 源程式碼在這裡:https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-node-6.html)
$ 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 的人來說,這個結果都在意料之中。JavaScript 是一種 JIT 編譯語言,擁有多個出色的運行時。

C++ 17
C++ 是一種編譯語言,這意味著它缺乏 Python 和 JavaScript 的一些便利性。除了嚴格的類型和晦澀難懂的語法之外,C++ 還需要提前編譯。
使用 -O2 編譯 C++ 程式碼需要 0.183 秒。(C++ 源程式碼在這裡:https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-gpp-9.html)
$ 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 編譯語言可以擊敗編譯語言。然而據我所知,實踐中並沒有真正出現過這樣的情況。

Python 萬歲!
Python 的性能確實在不斷提升,這對我們來說無疑是個天大的好訊息。Python 的語法非常簡潔,常常作為新手程式設計師的入門程式語言。
JIT 編譯 CPython 確實取得了付出了很大的努力,這裡我要著重表揚 Torch Dynamo(https://github.com/pytorch/torchdynamo)。儘管這個庫面向的是 PyTorch 程式碼,但這是一項通用的位元組碼重寫技術,值得深入了解。