說明:由於我是開發成員之一,本文原文在起草過程中我也做了修改,所以這裡就以半作者半譯者的形式發出來了。譯文幾乎與原文同步釋出,如有錯別字請指正。
今天我們非常激動的宣佈Pyston這款高效能Python JIT釋出了0.5版本。過去幾個月我們一直都沒有什麼新訊息,這是因為我們在幕後憋新東西,現在是時候放出來了。如果我們選擇其他方向去突破,或許能讓成果更加耀眼。不過這次憋出來的新東西讓Pyston更具有實用性。
Pyston現在使用與CPython相同的引用計數垃圾回收方式了。
引用計數
引用計數是一種自動記憶體管理的形式。與追蹤式垃圾回收器(GC,注:本文中認為引用計數不是GC的一種,所以下面的“垃圾回收”一詞並不包括引用計數,請注意)比起來,人們通常認為引用計數比較簡單,且速度較慢。之前版本的Pyston都使用了追蹤式垃圾回收器,而從0.4到0.5,我們花了很大力氣切換到了引用計數的方式。
我們為什麼換回引用計數呢?因為CPython(主要的Python實現)使用引用計數。之前我們試圖使用垃圾回收(GC)來獲取效能提升。但CPython API基於引用計數,使用追蹤式垃圾回收實現這些API會帶來許多效能問題。而Pyston具有一個非常有挑戰性的目標,即Pyston希望支援海量的針對CPython引用計數方式實現的已有程式碼(如當引用計數減為0後立即回收物件)。在支援CPython的第三方庫過程中,會一直遇到很多相容性的問題,其中有些甚至無法在當前的框架下解決。
為了獲得與CPython更好的相容性,於是我們咬咬牙切換到了引用計數,
大家覺得我們做的怎麼樣?
NumPy
我們很高興的宣佈Pyston可以無障礙的執行NumPy。
說明:對於最新的NumPy 1.11,Pyston執行其測試套件只有一個錯誤,而這個錯誤出自NumPy上游。我們已經提交了一個補丁給NumPy來修復這個問題。對於最新的master庫,Pyston執行NumPy測試還有3個錯誤。為了在Pyston中編譯NumPy,需要使用修改過的Cython,同時現在在Pyston中執行NumPy測試套件要比CPython慢一點。
這裡我補上NumPy在Pyston中的執行時間吧(CPython在我的機器上大概需要30-40s):
1 |
Ran 6139 tests in 102.170s |
不管怎樣,我們對於這個結果很滿意,特別是我們會繼續改進相容性並提升效能。
其他方面
這個版本還包括許多其他改進:
- 訊號處理
- Frame introspection of exited frames(這裡怎麼翻譯都不得體,先這樣吧)
- Generator cleanup
- 支援更多的C API,如custom tracebacks
- 許多其他小的修復
在支援NumPy的過程中受益良多,如順帶中支援了其他一些庫(py.test、lxml、cffi)。同時之前我們對來自CPython的標準庫和C擴充套件做了很多修改,現在這些修改已經改回去了。總之,使用引用計數是個非常大的投資,這個投資讓我們更好的相容CPython,否則我們要花很多時間去相容CPython。
效能提升
很遺憾,由於效能提升並不是這個版本的目標,所以效能方面還有所下降。0.5版比0.4慢了10%,很大一部分是由於切換到了引用計數上。由於過去6個月我們只是關注在相容性上,同時我們的引用計數的實現仍然有許多改進空間,所以對於這個結果我們目前可以接受。
從另一方面來說,人們一般會認為引用計數比垃圾回收要慢。但我們認為垃圾回收的實現方式在相容性方面有所阻礙(注:想想PyPy吧)。
目前Pyston在效能上還有許多可供改進的地方,但在完成引用計數的過程中我們都沒有去實現。現在我們有 許多issue,有興趣的貢獻者可以去看看,有些可以改進NumPy的效能。
目前,在Pyston中執行NumPy測試套件的耗時是CPython的兩倍多。我們不知道對於實際的NumPy程式,效能會有什麼差異,但我們知道效能下降主要由於兩方面:一是NumPy執行了一些Pyston中目前沒有優化的程式碼路徑;第二點有點微妙:NumPy的執行過程經常從C程式碼回到Python執行時,Pyston處理這方面很耗時,因為我們的JIT目前無法在此進行優化。Pyston中有方法來處理這種情況,並從C程式碼中呼叫JIT,我們計劃應用這些方法,讓NumPy和其他庫能從中受益。
將來
我們為這麼長的釋出週期再次道歉。我們沒有預料到新增引用計數會耗時這麼久。我們計劃再發布一篇部落格來介紹切換到引用計數過程中遇到的難點,以及Pyston引用計數實現的的細節。
在將來,Pyston 0.6會側重於效能方面。我們樂於從社群得到反饋,來決定那些方面需要優化效能。我們可以改善NumPy測試套件執行時間,不過這些改善或許不會反映到實際的NumPy程式中。
現在我們希望能通過docker讓使用者更方便的嘗試Pyston,或許這無法應付所有情況,但可以讓人們更好的嘗試Pyston:
1 |
docker run -it pyston/pyston |
也可以閱讀我們的 readme 來了解其他獲得Pyston的方法。若要嘗試NumPy,使用“pyston/pyston-numpy”命令。
我們已經有了若干優化的主意,但我們不希望“這一點點改進”延誤0.5的釋出。我們可能會發布0.5.1來新增這些效能改進。
結語
引用計數讓Pyston在成為CPython完美替代品的道路上又前進了一步。當前仍有許多工作需要做,但我們覺得有了引用計數後,就快達到讓使用者使用的地步了。但Pyston仍然是在開發中的軟體,所以會有許多問題和未優化的情形。但我們希望能得到您的反饋,來了解哪些可以工作,哪些無法工作。
最後,我們想感謝所有對這個版本有幫助的Pyston開源貢獻者。特別是 Nexedi 僱員孫波翔,他是我們的核心貢獻者,對NumPy的支援幫助很大。
- Boxiang Sun(我)
- Dong-hee Na 韓國人。。。
- Rudi Chen 這是加拿大人,華裔。
- Long Ang 這個是來自leancloud的國人,公司主頁:https://leancloud.cn/ 大家可以去了解一下。
- @LoyukiL
- Tony Narlock
- Felipe Volpone
- Daniel Milde
- Krish Monut
- Jacek Wielemborek
對了,介意在下面打賞我一下嗎。。。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式