Python離JIT還有多遠?

個人覺得Python作為一種動態語言未來性能提高將主要依賴於JIT。

PyPy通過JIT技術可以使得python速度提高近十倍,同時保證兼容性。

但是PyPy進度緩慢目前仍然在 Python 2.x 發展,主要是什麼限制了pypy的發展?

Python 3.5 中加入了 Type Hints 特性,這是否暗示了Python在為將來JIT的支持提供潛力?

PEP 0484 -- Type Hints

Python JIT的未來到底會是什麼?會是 PyPy 繼續發展支持 Python 3.x ?還是CPython 本身發展出一些 JIT 特性?

以及,這一切還有多遠?


Python 3.5的type hints主要還是文檔意義和type checker意義大,目前看來對JIT編譯器並沒有多少作用。

如果CPython社區自身不抗拒的話,說不定「實用」且「現實」的基於CPython的JIT編譯器很快就會進入大眾視野了。

請參考近期動態,都是基於CPython來直接加JIT(而不是另起爐灶像PyPy或者Pyston),保證最大限度兼容性:

  • 如何評價微軟推出的 Pyjion? - RednaxelaFX 的回答 &<- 微軟的有愛人士在努力設計一個簡單的嵌入到CPython的C API來支持外部JIT編譯器插入到CPython運行時,並基於這個API在做實驗性實現

  • 如何評價 IBM 的 Ruby + OMR? - RednaxelaFX 的回答 &<- IBM OMR項目有為CPython提供JIT的實驗實現


聲明,我剛入門,不是資深的開發者。我目前在Nexedi工作,試圖讓NumPy可以運行在Pyston中。

針對題主的問題,簡單回答就是:很快,Pyston就是使用JIT技術的Python實現,目前處於0.5版本,年內應該可以在兼容性上完善到PyPy的水準。效率上仍有待提高。

複雜一點:就是取決於題主如何定義有多遠了。Pyston和PyPy目前都不支持3.x,CPython採用了引用計數,其C API也使用了這個技術,這對其他任何基於JIT技術的Python實現都是一個攔路虎。如果期望有一款Python實現能同時支持2.x和3.x,兼容已有的為CPython編寫的第三方庫、效率大大提升、跨平台,那麼還有很長的一段路要走。

先介紹一下Pyston, Pyston是Dropbox實現的Python編譯器/解釋器。其設計思想有些類似Google曾經的Unladen Swallow, 即大量採用CPython的代碼和模塊,保持兼容性,在此基礎上使用JIT技術提升運行效率。目前僅支持Python 2.x。

針對題主的回答。

個人覺得Python作為一種動態語言未來性能提高將主要依賴於JIT。

完全贊同!

PyPy通過JIT技術可以使得python速度提高近十倍,同時保證兼容性。

PyPy只在特定領域讓Python的執行速度變快,兼容性也僅僅在於Python語言本身上。而對第三方庫的支持依然不太好。典型的就是各種科學計算庫,PyPy目前使用的是自行實現的NumPy。不過期待PyPy將要發布的通過新實現的C API來支持原生NumPy的進展。

但是PyPy進度緩慢目前仍然在 Python 2.x 發展,主要是什麼限制了pypy的發展?

、人(歸根結底還是錢

Python 3.5 中加入了 Type Hints 特性,這是否暗示了Python在為將來JIT的支持提供潛力?

PEP 0484 -- Type Hints

幫助非常大,現階段,Pyston對代碼進行JIT都需要推導類型,但如果類型推導錯了,就要回退,這很影響效率的。Type Hints能提高JIT獲取變數類型的效率。 但是任何一款Python編譯器/解釋器都需要兼容已有的代碼,這一點或許可以在編譯階段來進行處理,比如語法解析器在掃描源碼的時候,如果發現使用了Type Hints,就跳過類型推導的步驟。

Python JIT的未來到底會是什麼?會是 PyPy 繼續發展支持 Python 3.x ?還是CPython 本身發展出一些 JIT 特性?

Pyston應該是一個更好的選擇。樓上有朋友說Pyston是另起爐灶,其實不完全正確,Pyston馬上就會切換回CPython的引用計數的垃圾收集方式。同時大量採用了CPython的代碼實現,比如Pyston中unicode的實現就完全採用了CPython的代碼。而我主要參與實現的float、complex等,都是盡量使用CPython的實現,只有在需要為JIT提升速度時才重新編寫代碼。只有long對象是完全重新實現的。PyPy才是另起爐灶。

以及,這一切還有多遠?

Pyston對Python 2.x的支持應該在今年可以完善,不論是效率還是兼容性上。3.x目前還沒有計劃。至於其他Python實現,依然要面對下面幾個問題:

  1. 兼容性(包括語言本身和對C API的兼容性)

  2. 跨平台

  3. 效率
  4. 支持2.x和3.x

考慮一下這幾個問題,然後對比一下已有的Python實現,只有PyPy和Pyston有希望。目前PyPy更加成熟,但我並不看好現在的這個C API支持方式。而Pyston走的是正確的道路上,所以我當初最後選擇了為Pyston貢獻代碼。

補充:為什麼我不看好PyPy的實現方式。除了正常的使用Python做Web開發、運維等,Python還會用做科學計算。前者接觸的不多,不太了解,但後者會對Python有些「奇技淫巧」的用法。就比如OpenCV的Python綁定,為了讓OpenCV在Python中的使用方式更加Pythonic,OpenCV選擇使用CPython的C API和NumPy的C API來封裝OpenCV的Mat數據結構,在底層直接訪問Mat中在內存中的數組,轉換成NumPy的ndarray。在Python中就直接操縱這個ndarray就可以了,零內存複製。每調用一個OpenCV的函數或數據結構,就需要調用相關的C API函數。如果這些C API函數都是模擬實現(封裝),而不是原生的,我擔心對效率有影響(目前PyPy還未放出其通過封裝的C API實現的NumPy,因此還沒有數據能夠驗證)。也就是說針對PyPy+OpenCV,能通過這個新的C API直接使用OpenCV官方的Python綁定當然是最好的,否則可能要自行實現基於cffi的OpenCV-PyPy綁定。這樣依然對已有的第三方庫支持不太好。

因此,對於模擬實現的C API能否實現一些比較tricky的使用方式,仍然需要觀察。同時這種模擬的C API如何應對引用技術中的循環引用也需要觀察一下。

關於Dropbox由Python轉Golang:

Pyston項目的BOSS,Kevin說,曾經轉過,還轉了不少,但目前轉換慢了下來。有些由Python轉為Golang的由開始慢慢像Rust轉過去,而Python依然保持穩定。

分割線

-----------------------

亂寫了一點,有想到的再補充。若內容有問題,歡迎各位挑錯!


Type Hints is for humans, not for compilers.

另外,現在PyPy3有了,解除GIL限制的PyPy-STM有了,NumPy兼容層有了,這不能算是發展緩慢吧。

Pyston項目前景不好說,我持觀望態度。目前兼容度不如PyPy,而且Pyston背後是Dropbox,而你們知道Dropbox的技術棧已經棄Python轉Go了。

至於CPython加JIT就甭想了。


啥時候CPython的語法特性趨於穩定了,開始認真做向下兼容了,JIT大概會提上日程。

至於pypy3,其實已經有了,只不過大家都拿C寫擴展,這貨沒法用啊……加之人家項目組募捐搞開發募了好久都還不到計劃的1/3,都不知道募捐速度能不能趕上通脹率了……

但願屆時我還活著……


pypy主要的問題,一是沒資源(沒錢,沒人等等),二是最早是一個研究項目,當時估計也沒想過實用化,損失了不少時間。 三因為py太慢導致初期不少人直接用c api擼了不少庫,而有些庫很不幸得到了廣泛的應用,pypy c api偏偏就不大好用,所以導致要無縫切換不大容易。例如numpy,pypy甚至有一個專門的版本。

type hint 可以看看這裡

Frequently Asked Questions

貌似對pypy用途不是特別大

當然要是說一句政治正確的話,前途是光明的,道路是曲折的。 前幾天連guido本人都說要想快, 用pypy。引用如下

"""

Guido van Rossum ?@gvanrossum Oct 20

.@Lucretiel@jykae@ThePSF Compiling to C/C++/etc. is not the focus of most Python development. If you want faster Python, sponsor PyPy!

"""

怎麼用? python pypy一起用唄。

================== 26/03/2016 ==============

pypy 5.0 之後對cpyext的支持好了一些,至少lxml是可以跑起來了,不需要那個lxml-cffi(這個似乎停了有一段時間了)

謹慎樂觀,以後直接支持numpy也是有可能的。


大概很遠,起碼目前看CPython沒戲,相對JIT,我覺得GIL解決下更好。

剩下的裡面我看好pypy和pyston。目前最優解是pypy,速度提升明顯。pyston現在還沒用在Dropbox線上呢,雖然最近pycon上講馬上要推廣上線了。另外只有2和Linux支持也很限制pyston很多場景。不過長期我個人看好pyston,如果Dropbox不倒的話……


JIT是用錢堆出來的


pypy最新的版本可以直接pip install scipynumpy matplotlib,不需要安裝特殊的numpy庫, 雖然scipy中還是有很多pkg不能用,不過考慮到開發人數,實際上已經非常不錯了


推薦閱讀:

異常(exception)和執行失敗有什麼區別?
Python是不是弱類型?如果是的話是不是僅僅因此就不需要泛型了?
windows下anaconda 安裝報錯, errno9,怎麼解決?
spyder 如何添加和安裝其他的包?
Python 做高頻交易系統適合哪個級別的延遲?

TAG:Python | PyPy | 即時編譯JIT | Python3x |