PyPy是一個虛擬機項目,主要分為兩部分:一個Python的實現和 一個編譯器
PyPy的第一部分: 用Python實現的Python
其實這么說并不準確,準確得說應該是用rPython實現的Python,rPython是Python的一個子集,雖然rPython不是完整的Python,但用rPython寫的這個Python實現卻是可以解釋完整的Python語言。
PyPy的第二部分:編譯器
這是一個編譯rPython的編譯器,或者說這個編譯器有一個rPython的前端,目前也只有這么一個前端,不過它的后端卻是不少,也就是說這個編譯器支持許多的目標語言,比較重要的有:C,CIL,JavaScript...
第一部分看成pypy(1)第二部分看成pypy(2)
為什么你在同一層面下同時需要這兩者?你可以這樣想一下:PyPy(1)是一個用RPython寫的解釋器,因此它能加載用戶的Python代碼并將它編譯成字節碼。但是這個用RPython寫的解釋器本身要能運行,就必須要被另外一個Python實現去解釋。我們可以直接用CPython去.運行這個解釋器。但是這個還不夠快取而代之,我們使用了PyPy(2)去編譯這個PyPy的解釋器,生成其他平臺(比如C,JVM或CLI)代碼在我們的機器上運行,并且還加入了JIT特性。JIT能夠把字節碼轉換成機器語言,pypy之所以快,是因為它整合了JIT跟蹤技術的優化編譯器。
pypy性能測試
Cpython2.7.6,pyston0.2,pypy2.2.1的性能對比,使用的是pyston源代碼目錄下的minibenchmarks和microbenchmarks中
的python代碼來跑,對比結果如下表所示