深思熟慮, 以其在人工智能領域的發展而聞名,最近宣布 已決定發布S6項目的源代碼,這是他從 Python 語言的 JIT 編譯器開發的。
這個項目很有趣 因為 被設計為擴展庫 它可以與標準 CPython 集成,其中 提供完整的 CPython 兼容性並且不需要修改 的解釋器代碼。 該項目自 2019 年以來一直在開發中,但不幸的是已縮減規模,不再開發。
S6 是 DeepMind 於 2019 年啟動的一個項目,旨在通過即時(“JIT”)編譯來加速 CPython。 這些函數將作為一個普通的 Python 庫提供,不需要對 CPython 解釋器進行任何更改。 S6 打算為 Python 做 V8 為 Javascript 做的事情(這個名字是對 V8 的致敬)。 這項工作基於 CPython 3.7 版。 根據工作負載,我們在常見基準測試中看到了高達 9.5 倍的加速。
決定發布源代碼的主要原因,如前所述,其中一個原因是該項目停止了支持,另一個主要原因是,基於所創建的開發,這些仍然可以用於改進 python .
我們已經在內部停止了 S6 的工作。 因此,此存儲庫已存檔,我們不接受拉取請求或問題。 我們開源並在下面提供了設計概述,以激發 Python 社區內的對話並激發未來改進 Python 的工作。
關於S6的操作,要提一下 用於 Python 的 S6 與用於 JavaScript 的 V8 引擎比較 就它解決的任務而言。 該庫將現有的 ceval.c 字節碼解釋器驅動程序替換為自己的實現,該實現使用 JIT 編譯來加速執行。
S6 檢查當前函數是否已經編譯 如果是,則執行編譯後的代碼,如果不是,則以類似於 CPython 解釋器的字節碼解釋模式執行函數。 解釋計算與正在處理的函數相關聯的執行語句和調用的數量。
達到某個里程碑後,開始構建過程以加快代碼速度 經常運行。 對strongjit中間表示進行編譯,優化後使用asmjit庫轉換為目標系統的機器指令。
根據負載的性質,在最佳條件下,與常規 CPython 相比,S6 的測試執行速度提高了 9,5 倍。
當執行 100 次迭代時 來自理查茲測試套件, 有7倍的加速度, 當運行包含大量數學的 Raytrace 測試時,它的速度提高了 3 到 4,5 倍。
難以優化的任務 與 S6 是使用 C API 的項目,比如NumPy,還有相關的操作需要檢查大量值的類型。
單個函數調用的性能也很差 由於使用了 S6 Python 解釋器的未優化實現(開發尚未達到解釋模式優化階段),從而消耗大量資源。
例如,在解包大量數組/元組的解包序列測試中,單個調用顯示出高達 5 倍的減速,而循環調用從 CPython 產生 0,97。
終於 對於那些有興趣了解更多信息的人,你應該知道JIT編譯器代碼是用C++編寫的,目前是基於CPython 3.7,另外源代碼已經在Apache 2.0許可下開放,可以查閱 從下面的鏈接。