Pyston 0.4已發布

jopen 9年前發布 | 8K 次閱讀 Pyston


譯者注:如果對Pyston還不了解,可以閱讀由Pyston的Leader——Kevin Modzelewski寫的Dropbox Pyston介紹,中文版 在此 。以及我對Pyston的一點粗淺評價。同時也可以閱讀英文的 FAQ 。本文幾乎與英文版同步發行,稍有倉促,我會在明天精校。

</div>

我們非常激動向大家發布Pyston 0.4,這是這款高性能Python JIT的最新版。該版本中含有眾多改進,最重要的是Pyston已經能夠渲染Dropbox的頁面,且在我們的性能測試中比CPython的快25%。同 時我們也非常激動的向大家展示Pyston的logo。

Pyston 0.4已發布

過去八個月來,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_codefunc_defaultsfunc_globals
  • 引入了hooks
  • Set解析(類似列表解析)
  • 改進了C API
  • 支持更多的標準命令行參數
  • 在REPL(即交互式命令行中)支持多行語句,0.3中只支持單行語句。
  • Traceback和frame對象,locals()
  • </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也包含許多性能上的改進,包括:

    • 添加自定義的C++ exception unwinder。根據Pyston特的特殊情況進行定制,讓C++異常效率提升兩倍。
    • 如果認為某個異常較為常見,則使用較快的基于返回代碼的(return-code-based)異常,如特殊的返回代碼,或運行時分析。
    • 添加baseline jit層,位于解釋器層和LLVM JIT層之間。這一層能讓代碼的執行速度接近LLVM層,但降低Pyston的啟動延遲。
    • 新的磁盤緩存技術,消除LLVM層中非初始運行的開銷。
    • 諸多Tracing改進,能生成更好的代碼,并支持更多的情形。
    • 新的C API調用約定,大幅提升C API的調用速度。
    • 將部分內建模塊轉成共享模塊,提升啟動速度。
    • 添加PGO構建,并在普通構建中使用其函數順序。
    • </ul>

      這里面沒有列出對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兼容性方面作出很大幫助。
      • </ul>

        總結

        在GitHub上有 預編譯的二進制Pyston可供下載 (不過請閱讀使用說明)。Pyston仍然在開發階段,所以會有崩潰或性能上的問題。如果讀者遇到了這些問題,可以在外面的 Gitter channel 上報告,或發起一個 Github issue 。我們期待您的反饋!

        如果你在灣區,我們在11月10號晚上6點半,在Dropbox舊金山辦公地點會有一個研討會。現在剩余空位不多,如果感興趣的話可以在 這里申請

        Pyston 0.5中同樣有許多值得期待的地方。當前的目標是實現最終幾個特性(如在推出棧幀退出后進行檢查),繼續提升性能,以及在Pyston上運行一些 Dropbox服務。這是令人興奮的時刻,同樣,我們也期待新的貢獻者!如果你有興趣為Pyston做貢獻,可以查看我們的 文檔 ,檢查 開放的issue列表 ,或僅僅 在Gitter中跟我們打個招呼

         本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
         轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
         本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!