Python 之父:要在 4 年之內,將 CPython 的速度提升 5 倍

Python code

【為什麼我們要挑選這篇文章】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 做數據分析!

AD