詳細的多維度測評,看看哪個 Python 版本速度最快!
哪個版本的 Python 最快?
當然,這些問題由多種因素決定,其中的主要的因素是什么呢?我們又如何為自己的應用尋找最快的 Python 版本呢?帶著這些問題,Hackermoon 上一位叫 Anthony Shaw 的作者為我們做了一些測試。
Anthony Shaw :Dimension Data 的 Talent 集團總監(jiān),Python 軟件基金會成員,Apache 基金會成員
以下是對作者原文的翻譯:
使用 Python 性能測試套件
正如之前我在 speed.python.org 網(wǎng)站提到的,Python 核心開發(fā)團隊非常重視性能問題,這對于比較官方基準和 CPython 版本非常有用。
-
如圖,測試結(jié)果很難直觀讀取
-
其中不包含 PyPy
你可以通過執(zhí)行 pip install performance 命令來下載測試套件,然后執(zhí)行如下命令:
pyperformance run --python={chosen_python_runtime} -o my_results.json
該命令會針對 Python 的目標版本多次運行一系列“實際”應用程序,并記錄測試結(jié)果,取其平均值。
本文我對以下官方版本進行了測試:
-
Python 2.7.10
-
Python 3.4.4
-
Python 3.5.4
-
Python 3.6.1
-
Python 3.7 beta 2(譯者注:作者進行測試時 Python 3.7 版本還未正式發(fā)布,beta 2 性能與正式版非常接近,同樣具有參考價值。Python 3.7 正式發(fā)布內(nèi)容請看這里)
同時還測試了 PyPy(5.6)和 PyPy 3(5.10.0)。
測試結(jié)果
我根據(jù)這套測試用例進行了測試,你也可以根據(jù)自己的情況自己編寫一套測試。
我編寫了一個簡單的腳本,來獲得性能數(shù)據(jù)文,并將它們繪制成了圖表。腳本代碼你可以在這里找到:
-
https://gist.github.com/tonybaloney/4e8e45f9128e9eb6e4f36c73ba5e5574
所有圖表都以秒為單位,數(shù)值越低,表示性能越好。
完整的測試結(jié)果及圖表展示可請參閱:
-
https://github.com/tonybaloney/performance_testing/tree/master/png
渲染 HTML 模板
django_html 測試將使用 Django 模板渲染引擎來構建一個 150x150 的 HTML 表格。 它利用了 Django 引擎的 Content 和 Template 類。
如圖所示,Python 3.7 比 Python 2.7 快 1.19 倍,但除此之外,其他 Python 3 版本都沒有 Python 2.7 快。該結(jié)果與 speed.python.org 網(wǎng)站的測試結(jié)果一致。
PyPy 的測試結(jié)果顯示,PyPy 比 CPython 的任何 Python 版本都快,PyPy 3 比 PyPy 慢兩倍。Django 2.0 及更高版本已決定放棄對 Python 2 的支持,因此 PyPy 將不再與 Django 2 兼容。
啟動時間測試
該部分測試解釋器的啟動時間
如圖所示,Python 2.7 是所有測試版本中啟動速度最快的。
注:此處暫不討論 PyPy 的測試結(jié)果,文末再談。
加密測試(Crypto):crypto_paes
在這個測試中,Python 2 的速度明顯快于 Python 3,因為 Crypto 要求大量數(shù)字運算,而 Python 3 沒有 32 位整數(shù)類型,只有一個長整型(long integer)。
同樣差距比較明顯的是,PyPy 3 比 PyPy 慢 5 倍。
算法測試:n-queens
結(jié)果顯示,在 CPython 系列中,Python 3.7 性能最佳。此外,PyPy 3 和 PyPy 測試結(jié)果比較接近,PyPy 小勝。
浮點運算測試
“浮點”基準測試需要人工創(chuàng)建繁重的浮點運算應用程序,在這里我們通過 math.cos(),math.sin() 和 math.sqrt() 函數(shù)創(chuàng)建,總共創(chuàng)建 10 萬個浮點對象。
PyPy 非常適合浮點運算,在大量的數(shù)字運算、可預測的類型和方法以及循環(huán)上展現(xiàn)了非常優(yōu)秀的性能。Python 3.7 具有新的方法能快速調(diào)用操作碼,該操作碼正在此測試中剛好用上,表現(xiàn)佳。
正則表達式測試
在這項測試中,我選用了 50 個最受歡迎的網(wǎng)頁,并記錄了所有正則表達式的操作。 每個操作都被賦予權重,該權重是根據(jù)頁面流行度的估計以及在加載每個頁面時執(zhí)行的次數(shù)來計算的。 最后,數(shù)據(jù)中的字母使用 ROT13 進行編碼,其方式不會影響正則表達式與輸入的匹配程度。
PyPy 的測試結(jié)果讓人大跌眼鏡,不知道它都經(jīng)歷了些什么......
補充:PyPy 后來看到了這項測試結(jié)果,花了幾個小時把問題修復了
Python 3 比 Python 2 快嗎?
綜上測試所述,答案是 Yes!雖然也有幾項測試結(jié)果顯示 Python 3 比 Python 2 慢:
-
加密測試:Python 3 的比 Python2 慢 1.35 倍(原因在上文已做解釋)
-
啟動時間測試:Python 3 比 Python 2 慢 1.39 倍
但從整體結(jié)果來看,Python 3 更快。CPython 核心開發(fā)團隊曾表示,啟動速度問題是他們在 3.8 和 3.9 版本中著重要解決的問題。
PyPy 很快,我要使用它嗎?
PyPy 有 JIT 即時編譯器,在執(zhí)行可預測的重復性任務時非常高效,而 Python 性能測試需要多次運行同一段代碼來保證準確性,因此,PyPy 面對這種測試性能,表現(xiàn)比 CPython 更佳。
但是,PyPy 的 JIT 編譯器的顯著缺點就是啟動成本高,并且,許多 C 語言擴展程序缺乏兼容性。另外,由于 PyPy 是用 Python 編寫的,許多模板在 PyPy 中無法工作,使用者需要時常進行檢查。
PyPy 也同樣需要面對從 Python2 向 Python3 轉(zhuǎn)變的問題。PyPy3 還不太穩(wěn)定,PyTest 就已經(jīng)放棄了對 PyPy3 的支持。
結(jié)論
Python 在所有官方版本測試中表現(xiàn)最佳,PyPy 在解釋器測試的表現(xiàn)最佳。Python 2 以后會用得越來越少,直到廢棄。如果 PyPy 3 的速度始終不能比 PyPy 快,能有所提升也是好的。