Pyston 0.4已發布
譯者注:如果對Pyston還不了解,可以閱讀由Pyston的Leader——Kevin Modzelewski寫的Dropbox Pyston介紹,中文版 在此 。以及我對Pyston的一點粗淺評價。同時也可以閱讀英文的 FAQ 。本文幾乎與英文版同步發行,稍有倉促,我會在明天精校。
</div>我們非常激動向大家發布Pyston 0.4,這是這款高性能Python JIT的最新版。該版本中含有眾多改進,最重要的是Pyston已經能夠渲染Dropbox的頁面,且在我們的性能測試中比CPython的快25%。同 時我們也非常激動的向大家展示Pyston的logo。
過去八個月來,Pyston從0.3升級到0.4,這期間含有2000多個commit,是0.2到0.3的三倍。雖然這次從0.3到0.4用了八個月,但今后將每四個月發布一次,
兼容性提升
0.4中實現了許多Python特性,雖然任何一個特性并不值得大書特書,但加起來就相當可觀了。這些特性包括:
- 支持Unicode類型
- 多重繼承
- 支持weakref和finalizers(
__del__
),包括正確的析構順序。 - with語句
- exec s in {}
- 改變已有函數的參數的值和個數。設置
func_code
、func_defaults
、func_globals
。 - 引入了hooks
- Set解析(類似列表解析)
- 改進了C API
- 支持更多的標準命令行參數
- 在REPL(即交互式命令行中)支持多行語句,0.3中只支持單行語句。
- Traceback和frame對象,locals() </ul>
- 添加自定義的C++ exception unwinder。根據Pyston特的特殊情況進行定制,讓C++異常效率提升兩倍。
- 如果認為某個異常較為常見,則使用較快的基于返回代碼的(return-code-based)異常,如特殊的返回代碼,或運行時分析。
- 添加baseline jit層,位于解釋器層和LLVM JIT層之間。這一層能讓代碼的執行速度接近LLVM層,但降低Pyston的啟動延遲。
- 新的磁盤緩存技術,消除LLVM層中非初始運行的開銷。
- 諸多Tracing改進,能生成更好的代碼,并支持更多的情形。
- 新的C API調用約定,大幅提升C API的調用速度。
- 將部分內建模塊轉成共享模塊,提升啟動速度。
- 添加PGO構建,并在普通構建中使用其函數順序。 </ul>
- 從Makefile構建系統遷移到基于CMake的構建系統中。這樣可以更好的配置、更快的構建(通過ninja)、并降低未來支持其他平臺的難度。這由開源貢獻者Daniel Agar完成,非常感謝你!
- 添加了更多的文檔。Pyston 維基頁面 中含有對Pyston內部工作機制的介紹,以及對新貢獻者的一些幫助信息。
- Pyston有了Logo!
- 11個開源貢獻者貢獻了184個commits。特別感謝孫波翔(譯注,也就是我了。。。),他對Pyston兼容性方面作出很大幫助。 </ul>
總之,這意味著Pyston幾乎支持所有Python語義。另外,Pyston還實現了許多用法,這些用法一般不認為是Python的特性,但一些常見的第三方庫中會用到。如支持內置函數中所有的參數組合(如將 None
傳遞給 map
),或一些技巧性的用法,如修改 sys.module
來改變一條導入語句的結果。
這些新特性意味著Pyston能支持許多常見的庫。現在Pyston已經能運行許多常見庫的測試套件,如Django和Sqlalchemy,今 后會支持更多庫。Pyston現在還將CPython的測試套件納入考察范圍,目前已將153個CPython測試文件(CPython共有401個)添 加到Pyston的測試套件中。
Pyston還初步支持了NumPy。目前,NumPy支持對Pyston的優先級并不高(Pyston最初的目標并不會用到NumPy),但我們依然花了一點時間來讓一些簡單的NumPy示例可以運行。
最重要的是,現在Pyston可以運行Dropbox的主服務器,并可以渲染其中的許多頁面。雖然還有許多工作需要完善(如讓測試套件運行、添加性能測試,這樣才能量化性能提升并進行比較),但我們已經獲得了可喜的成果。
C API
Pyston 0.4改進了C API的支持,這對運行Dropbox服務器幫助很大。CPython擁有C API,用來編寫擴展模塊。在Pyston 0.2時添加了基本的C API兼容層,將Pyston的API轉換成CPython的C API。現在這個C API的兼容性已經得到大幅改進,不僅能支持C擴展,還能運行CPython的內部代碼。這意味著如果需要支持新的API函數,可以直接使用 CPython的實現,而不用在Pyston的API上實現了。
由于Pyston中使用了越來越多的CPython代碼實現了許多API。所以現在Pyston的C API已經不單單是個兼容層。CPython現在就是Pyston運行時的基礎,而不是Pyston試圖兼容的目標。這對運行Dropbox的服務器也很 重要,因為現在能直接使用CPython中含有很多技巧的實現。如Unicode處理。如果全部自己從頭實現Python運行時的話,那么時間都花在造輪 子上面,現在也就達不到運行Dropbox的地步了。
性能提升
同樣,Pyston 0.4也包含許多性能上的改進,包括:
這里面沒有列出對LLVM層的優化。Pyston的LLVM層在微基準測試中表現很好,但在“實際代碼”中,即使知道所有對象的類型,表現也不好。這是因 為了解對象的類型僅僅是動態性的第一步,即只能知道應該調用哪個函數,但這個函數本身經常含有動態調用。例如,如果調用 len()
函數,可以消除動態分配并直接調用 len()
的實現。但這個實現會在內部動態調用 arg.len()
。而 len()
是非常常見的,可以在LLVM層中特殊處理,這種多層次動態性非常常見,現在不斷以來Pyston中的mini tracing JIT來同時處理所有層。這讓能對每個單獨個字節碼獲得很好的結果,但缺點是無法很好的在字節碼之間進行優化。我們的目標是集成基于單個字節碼的 tracing JIT和LLVM的method JIT,以此來獲得最好的結果。
基準測試
Pyston更新了基準測試淘金,使用了三個真實的庫,分別為pyxl、django、sqlalchemy。基準的選擇是一個 有爭議的話題 。但這三個是Python Web服務器中非常典型的。
在這個基準測試中,Pyston比CPython快25%,但比PyPy 4.0.0慢25%。這里有完整的 性能跟蹤頁面 ,其中含有 最新的基礎測試結果 (說明:后一個鏈接會隨著時間自動更新,且由于配置不同,性能提升的量也會與25%有出入)。
社區
還有若干令人興奮的消息,雖然這些與Pyston的代碼沒有直接聯系:
總結
在GitHub上有 預編譯的二進制Pyston可供下載 (不過請閱讀使用說明)。Pyston仍然在開發階段,所以會有崩潰或性能上的問題。如果讀者遇到了這些問題,可以在外面的 Gitter channel 上報告,或發起一個 Github issue 。我們期待您的反饋!
如果你在灣區,我們在11月10號晚上6點半,在Dropbox舊金山辦公地點會有一個研討會。現在剩余空位不多,如果感興趣的話可以在 這里申請 。
Pyston 0.5中同樣有許多值得期待的地方。當前的目標是實現最終幾個特性(如在推出棧幀退出后進行檢查),繼續提升性能,以及在Pyston上運行一些 Dropbox服務。這是令人興奮的時刻,同樣,我們也期待新的貢獻者!如果你有興趣為Pyston做貢獻,可以查看我們的 文檔 ,檢查 開放的issue列表 ,或僅僅 在Gitter中跟我們打個招呼