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