【為什麼我們要挑選這篇文章】Python 是很受歡迎的程式語言,開發效率高,然而它的速度比 C 語言等程式語言慢,是它的缺點。近日,Python 之父表示要在 4 年內,將 Python 下的 CPython 速度提升 5 倍。他打算怎麼做?(責任編輯:郭家宏)
本文經 AI 新媒體量子位(公眾號 ID:QbitAI)授權轉載,轉載請連繫出處
作者:量子位
5 月中旬剛剛結束的 Pycon US 2021 上,Python 之父 Guido van Rossum 提出要在未來 4 年內將 CPython 速度提升 5 倍。
而這一「Shannon 計劃」的參與者除了 Guido 本人之外,還有任職微軟的 CPython 核心開發人員 Eric Snow,以及 Semmle 的研究工程師 Mark Shannon。
但在此之前,Guido 可並不認為提升 CPython 的速度有多關鍵,因為「有其他方法可以獲得更好的性能」,比如 JIT 編譯的 PyPy,或使用 C 語言編寫擴展。
為什麼要將 Python 加速?
Python 真的慢嗎?
不見得,開發效率和執行速度本就難以兼得。
而且發展到今天,Python 已經是一個膠水語言的定位,主要用來快速建構系統的邏輯控制流,再把對性能要求高的部分丟給 C/C++ 來實現。
不過如果只看標準版的語言實現本身的話……它的性能確實不怎麼樣。
動態語言的特性決定了 Python 會在 C 語言代碼運行(runtime)上花費大量的時間,且難以使用 JIT(Just-In-Time)進行優化。
在接受英國技術新聞網站 The Register 的採訪時,對於「為什麼開始關注 CPython 性能?」的問題,Shannon 表示:
過去幾年裡,Python 在機器學習領域的使用率大大提升,可用資源也越來越多。這意味著我們可以不用擔心破壞其可靠性,而是專注在性能上。
並且,Shannon 之前參與的 HotPy 專案中所開發的解釋器,比目前 CPython 解釋器的純 Python 程式碼快三倍。這證明了對 CPython 優化的可行性。
而在去年 10 月份的時候,耐不住退休寂寞的 Guido 又加入了微軟:
再加上疫情的家裡蹲 buff,擁有了更多時間的大佬們一拍即合,決定 Make Python Great Again。
讓 Python 加速沒那麼簡單
Shannon 坦言,向下兼容是加速 Python 的最大挑戰。
其實不僅是對 Python,90 年代末 libc 的那次不兼容更新,直接導致所有應用程式都要重編……
而現在已經涼涼的 Pyston,官方文章裡提到的 Dropbox 放棄 Pyston 專案的幾大因素中,第一個也是:
這就是所有既試圖兼容 CPython,又想大幅提升性能的 Python 都會遇到的嚴峻問題。
因為 Python 的執行類似於 HTML 渲染:更多是對運行時應如何執行 C 庫的描述,而非單步執行命令。
所以,Python 性能提升的源頭來自於這些 C 擴展模組。而 CPython 又有著超過 400k 的 loc,這意味著要從底層去做優化是一項非常龐大的工程。
特別是對於過於動態的 Python 語言來說,語言的語義對優化的影響就更大了。
而現在加速的過程中,像是 CPython 的工具、調試器、配置文件,NumPy 包,以及 Cython 這樣的編譯器,又會有多少涉及到 CPython 內部和底層的行為?
因此 Shannon 表示:
要改變是困難的……與 CPython 用戶間的隱形協議並沒有很好地定義什麼能改,什麼不能改。
可能是 5 年前從 Python 2.x 遷移到 3 的痛苦經歷實在是有些刻骨銘心,Guido 專門發推表示這次的遷移會更加平和。
而他也在 Python 峰會中承諾:不破壞 stable ABI 兼容性;不破壞 limited API 兼容性;不破壞或減緩 extreme cases。
「總之,程式碼的可維護性才是第一要務。」
讓 CPython 速度提升 5 倍的 4 個階段
按照已在 GitHub 上發佈的 faster-cpython,Shannon 計劃具體分為四個階段:
Python 3.10
預計在今年 10 月發佈,主要添加一個自適應、專業化的解釋器(interpreter)。
解釋器將不再遇運行時生成程式碼,而是利用程式中的類型穩定性,在執行過程中適應類型和數值。
Python 3.11
Guido 提出要在 3.11 版本實現至少 2 倍的提速,為此,他已經和幾位 Python 開發人員提出了一份增強功能的提案 PEP 659。
這一提案中表示要增加適應性的位元組碼解釋器,並且實施更有效的異常處理。
除此之外,還提出了優化幀堆棧、改變函數調用的方式、增加優化以加快啟動時間,以及修改 .pyc 位元組碼緩存文件格式等工作。
Python 3.12
這一階段使用針對小區域的 JIT 解釋器,在運行程式碼時簡單、快速地對小區域的專門程式碼進行編譯。
Python 3.13
同樣在程式碼運行時對擴展區域進行編譯,增強編譯器,以完成 5 倍的超級加速。
Guido 表示,此次圍繞性能展開的 Python 變更,將主要服務於運行 CPU 密集型純 Python 程式碼的開發者,以及內置 Python 網站的用戶。
而在 C 語言程式碼(如 NumPy 和 TensorFlow)、I/O 綁定程式碼、多線程程式碼以及演算法程式碼上,提升效果將會比較有限。
微軟支援 Python 更新
其實,微軟長期以來一直以多種方式為 Python 專案提供助力,包括在 Azure 雲端 AI 服務課程裡發佈免費的 Python 課程,以及透過 VS Code Python 擴展在 Win10 及以上版本支持 Python。
自 2006 年起,微軟還成為了 Python 軟體基金會(PSF)的贊助商,並在今年出資 15 萬美元進行資助。
目前已有五位 Python 開發者社區的核心人員在微軟任職,包括去年年底加入的 Python 之父,和這次 Shannon 計劃裡的三人之一 Eric Snow。
Guido 也在這次峰會裡特地 cue 了一下微軟,提出微軟資助了一支小型 Python 團隊「負責語言解釋層面的性能改進工作」,以使他能攜手微軟同事持續對 Python 進行開發。
當然,對於 3.11 版本的短期目標,Guido 還是在 ppt 中給自己兜了個底。

而對於那個 4 年 5 倍速的最終目標,Guido 則表示「我們必須保持旺盛的創造力。」
Python version 3.11.0 alpha 0 GitHub 連結
A faster CPython 計劃簡介
參考資料
《The Register》、《Pyfound》、《Python》
(本文經 AI 新媒體量子位 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為〈Python之父:明年让Python快2倍〉。首圖來源:Wikimedia Commons CC Licensed)
延伸閱讀
「比起管理職,我更想當 AI 工程師!」年過半百的文組老闆從零自學 Python
【藏秘密文件的小技巧】駭客把圖片上傳 Twitter,下載後改副檔名變成「Python 程式碼」
裝上這個外掛,不用寫 code 就能用 Python 做數據分析!