Python 是數(shù)據(jù)科學(xué) (DS) 和機器學(xué)習(xí) (ML) 中最常用的腳本語言之一。根據(jù)“ PopularitY of Programming Languages ”,Python 是 Google 上搜索次數(shù)最多的語言。除了作為將各種 DS/ML 解決方案連接在一起的出色膠水語言之外,它還有許多庫可以對數(shù)據(jù)進(jìn)行虛擬處理。
大約一個月后,我們獲得了 Python 的全新年度版本:3.11 版。我對這個新版本感到非常興奮,因為這個版本的主要特點是速度顯著提高。
要了解 Python 3.11 真正的速度有多快,最好的方法是自己運行測試。

對編程語言進(jìn)行基準(zhǔn)測試并非易事。當(dāng)您閱讀x比y快時,您應(yīng)該始終對結(jié)果持保留態(tài)度。一種算法的實現(xiàn)可能比x更好,而另一種算法在y上更好。對于我們的基準(zhǔn)測試,它有點簡單,因為我們正在針對 Python 測試 Python,但我們可能從語言中選擇了僅受到輕微影響的元素??紤]到這一點,我想介紹我用來進(jìn)行基準(zhǔn)測試的算法:使用蒙特卡洛方法估計 Pi。
這個算法的想法很簡單,但是在大學(xué)的一些數(shù)學(xué)課程中第一次看到它讓我大吃一驚。我們有一個大小為2r的正方形,在這個正方形中我們擬合一個半徑為r的圓。現(xiàn)在我們采用一個隨機數(shù)生成器,它在平面上生成數(shù)字:<-r, r>, <-r, r>。圓上的點與正方形上的點之間的比率(讀?。核悬c)是面積比的近似值,我們可以用它來近似 Pi。這在等式中更清楚一點:

在 Python 中,我將實際估計與測試腳本分開,這樣我就可以重復(fù)測試并取平均值。此處未顯示,但我還使用Argparse對腳本進(jìn)行了參數(shù)化,這是一個用于解析來自命令行界面 (CLI) 的參數(shù)的標(biāo)準(zhǔn)庫。Python 代碼如下所示:
該腳本已準(zhǔn)備好運行,但我們希望使用它來測試各種版本的 Python,而不僅僅是當(dāng)前安裝(或激活)的版本。測試多個 Python 版本的最簡單方法是使用 Docker。Python 維護著許多 docker 鏡像。自然是所有受支持的版本,還有一些生命周期結(jié)束 (EOL) 的版本,例如 2.7 或 3.2。它還具有用于發(fā)布候選版本的圖像,例如版本 3.11。要使用 Docker,您需要安裝它。在 Linux 和 Mac 中它相對容易,在 Windows 中我不太確定,但可能也不難。我建議只安裝 docker CLI,桌面對我來說太臃腫了。要在容器化 Python 環(huán)境中運行本地腳本,請運行:
為了自動化各種版本的測試,我們當(dāng)然也會使用 Python。這個腳本將簡單地啟動一個子進(jìn)程來啟動一個具有特定 Python 版本的容器,然后收集結(jié)果。沒什么特別的:
運行這些測試時,絕對數(shù)量因機器而異,具體取決于處理器(CPU 很重)。以下是最近 7 個主要 Python 版本的結(jié)果:

新的 Python 3.11 每次運行耗時 6.4605 秒。Python 3.5 耗時 11.3014 秒。(Python 3.11 快 74.9%)
Python 3.6 耗時 11.4332 秒。(Python 3.11 快 77.0%)
Python 3.7 耗時 10.7465 秒。(Python 3.11 快 66.3%)
Python 3.8 耗時 10.6904 秒。(Python 3.11 快 65.5%)
Python 3.9 耗時 10.9537 秒。(Python 3.11 快 69.5%)
Python 3.10 耗時 8.8467 秒。(Python 3.11 快 36.9%)</pre>
Python 3.11 的基準(zhǔn)測試平均耗時 6.46 秒。與之前的版本 (3.10) 相比,這幾乎快了 37%。相當(dāng)令人印象深刻!3.9 版和 3.10 版之間的差異大致相同,使 3.11 版快了近 70%!我已經(jīng)在圖 2 中繪制了所有時間。
在談?wù)撍俣葧r,我們總是有一個人說:如果你想要速度,為什么不使用 C。
C 比 Python 快得多!——那個人
雖然我的 C 有點生銹,但我還是想試試看。我使用了 GNU C++,因為它帶有一個不錯的時間測量庫(chrono)。找到下面的代碼:
眾所周知,C++ 是一種編譯語言,因此我們需要先編譯源代碼才能使用它。
編譯后,只需運行構(gòu)建可執(zhí)行文件。輸出應(yīng)該是這樣的:
Pi 約為 3.14227,計算時間為 0.25728 秒。
Pi 約為 3.14164,計算時間為 0.25558 秒。
Pi 約為 3.1423,計算時間為 0.25740 秒。
Pi 約為 3.14108,計算時間為 0.25737 秒。
Pi 約為 3.14261,計算時間為 0.25664 秒。每個循環(huán)平均需要 0.25685 秒來計算。
我們必須同意那個人的觀點,因為它真的(閱讀:真的)很快。執(zhí)行我們之前在 Python 中編寫的相同循環(huán)只需要 0.257 秒。讓我們在之前的圖中將其添加為一條線,如圖 3 所示。

現(xiàn)在,在對之前的數(shù)字進(jìn)行了更長時間的欣賞之后,我們清楚地看到了 Python 獲得的動力。自 3.9 版以來,Python 的速度提高了約 35%。Python 開發(fā)人員提到,接下來的幾個版本將顯著提高速度,因此,我們可以假設(shè)這個速度將保持不變(是的,超級安全的假設(shè))。
現(xiàn)在的問題是,在這種勢頭固定的情況下,Python 何時會超越 C++ 的時代。為此,我們當(dāng)然可以使用外推法來預(yù)測下一個 Python 版本的循環(huán)時間。這些可以在圖 4 中看到。

圖 4:推斷 Python 速度 -> Python 3.14 的速度將超過 C++。驚人?。ㄗ髡邎D片)。
結(jié)果真的很驚人!保持這個速度,Python 3.14 將比 C++ 更快。確切地說,循環(huán)時間為-0.232秒,因此它會在您想要進(jìn)行計算之前完成。時空連續(xù)體中似乎有一個洞,但這些計算是堅如磐石的。因此,我認(rèn)為我們可能不得不質(zhì)疑愛因斯坦和朋友的工作。