譯者注:
如果對Pyston還不瞭解,可以閱讀由Pyston的Leader——Kevin Modzelewski寫的Dropbox Pyston介紹,中文版在此。以及我對Pyston的一點粗淺評價。同時也可以閱讀英文的FAQ。
我們非常激動向大家釋出 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()
總之,這意味著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也包含許多效能上的改進,包括:
- 新增自定義的C++ exception unwinder。根據Pyston特的特殊情況進行定製,讓C++異常效率提升兩倍。
- 如果認為某個異常較為常見,則使用較快的基於返回程式碼的(return-code-based)異常,如特殊的返回程式碼,或執行時分析。
- 新增baseline jit層,位於直譯器層和LLVM JIT層之間。這一層能讓程式碼的執行速度接近LLVM層,但降低Pyston的啟動延遲。
- 新的磁碟快取技術,消除LLVM層中非初始執行的開銷。
- 諸多Tracing改進,能生成更好的程式碼,並支援更多的情形。
- 新的C API呼叫約定,大幅提升C API的呼叫速度。
- 將部分內建模組轉成共享模組,提升啟動速度。
- 新增PGO構建,並在普通構建中使用其函式順序。
這裡面沒有列出對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的程式碼沒有直接聯絡:
- 從Makefile構建系統遷移到基於CMake的構建系統中。這樣可以更好的配置、更快的構建(通過ninja)、並降低未來支援其他平臺的難度。這由開源貢獻者Daniel Agar完成,非常感謝你!
- 新增了更多的文件。Pyston維基頁面中含有對Pyston內部工作機制的介紹,以及對新貢獻者的一些幫助資訊。
- Pyston有了Logo!
- 11個開源貢獻者貢獻了184個commits。特別感謝孫波翔(譯註,也就是我了……),他對Pyston相容性方面作出很大幫助。
總結
在GitHub上有預編譯的二進位制Pyston可供下載(不過請閱讀使用說明)。Pyston仍然在開發階段,所以會有崩潰或效能上的問題。如果讀者遇到了這些問題,可以在外面的Gitter channel上報告,或發起一個Github issue。我們期待您的反饋!
如果你在灣區,我們在11月10號晚上6點半,在Dropbox舊金山辦公地點會有一個研討會。現在剩餘空位不多,如果感興趣的話可以在這裡申請。
Pyston 0.5中同樣有許多值得期待的地方。當前的目標是實現最終幾個特性(如在推出棧幀退出後進行檢查),繼續提升效能,以及在Pyston上執行一些Dropbox服務。這是令人興奮的時刻,同樣,我們也期待新的貢獻者!如果你有興趣為Pyston做貢獻,可以檢視我們的文件,檢查開放的issue列表,或僅僅在Gitter中跟我們打個招呼。
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式