聊聊Python中的pypy
PyPy是一個(gè)虛擬機(jī)項(xiàng)目,主要分為兩部分:一個(gè)Python的實(shí)現(xiàn)和 一個(gè)編譯器
PyPy的第一部分: 用Python實(shí)現(xiàn)的Python
其實(shí)這么說(shuō)并不準(zhǔn)確,準(zhǔn)確得說(shuō)應(yīng)該是用rPython實(shí)現(xiàn)的Python,rPython是Python的一個(gè)子集,雖然rPython不是完整的Python,但用rPython寫(xiě)的這個(gè)Python實(shí)現(xiàn)卻是可以解釋完整的Python語(yǔ)言。
PyPy的第二部分:編譯器
這是一個(gè)編譯rPython的編譯器,或者說(shuō)這個(gè)編譯器有一個(gè)rPython的前端,目前也只有這么一個(gè)前端,不過(guò)它的后端卻是不少,也就是說(shuō)這個(gè)編譯器支持許多的目標(biāo)語(yǔ)言,比較重要的有:C,CIL,JavaScript...
第一部分看成pypy(1)第二部分看成pypy(2)
為什么你在同一層面下同時(shí)需要這兩者?你可以這樣想一下:PyPy(1)是一個(gè)用RPython寫(xiě)的解釋器,因此它能加載用戶的Python代碼并將它編譯成字節(jié)碼。但是這個(gè)用RPython寫(xiě)的解釋器本身要能運(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ī)器語(yǔ)言,pypy之所以快,是因?yàn)樗狭薐IT跟蹤技術(shù)的優(yōu)化編譯器。
pypy性能測(cè)試
Cpython2.7.6,pyston0.2,pypy2.2.1的性能對(duì)比,使用的是pyston源代碼目錄下的minibenchmarks和microbenchmarks中
的python代碼來(lái)跑,對(duì)比結(jié)果如下表所示
|
Cpython2.7.6 |
pyston0.2 |
|
microbenchmarks |
|
|
|
attribute_lookup.py |
258.544s |
200.387s |
2.667s |
attrs.py |
0.622s |
1.658s |
0.086s |
closures.py |
0.485s |
6.658s |
0.058s |
empty_loop.py |
3.532s |
19.248s |
0.248s |
fib2.py |
3.375s |
0.669s |
0.804s |
fib.py |
3.696s |
0.636s |
0.864s |
function_calls.py |
5.283s |
0.878s |
0.303s |
gcj_2014_2_b.py |
1.527s |
45.803s |
0.276s |
gcj_2014_3_b.py |
0.022s |
0.174s |
0.069s |
iteration.py |
0.185s |
1.242s |
0.062s |
lcg.py |
2.910s |
9.097s |
0.235s |
listcomp_bench.py |
10.132s |
56.170s |
1.379s |
nested.py |
0.368s |
6.828s |
0.057s |
polymorphism.py |
4.358s |
4.390s |
14.260s |
prime_summing.py |
20.197s |
43.779s |
1.250s |
pydigits.py |
0.034s |
Failed |
0.039s |
repatching.py |
0.475s |
0.384s |
0.061s |
simple_sum.py |
0.075s |
0.578s |
0.040s |
sort.py |
2.216s |
4.587s |
0.135s |
thread_contention.py |
6.486s |
8.133s |
0.240s |
thread_uncontended.py |
1.324s |
5.823s |
0.238s |
unwinding.py |
1.082s |
93.180s |
4.481s |
vecf_add.py |
9.890s |
Failed |
0.059s |
vecf_dot.py |
4.944s |
8.434s |
0.062s |
|
|
|
|
minibenchmarks |
|
|
|
allgroup.py |
0.836s |
Failed |
18.804s |
chaos.py |
26.268s |
Failed |
1.392s |
fannkuch_med.py |
0.990s |
1.898s |
0.325s |
fannkuch.py |
10.952s |
20.834s |
2.057s |
Go.py |
53.787s |
Failed |
33.638s |
interp2.py |
5.521s |
10.124s |
0.701s |
interp.py |
10.863s |
5.035s |
0.563s |
nbody_med.py |
3.132s |
6.642s |
0.601s |
nbody.py |
12.677s |
25.540s |
1.470s |
nq.py |
29.879s |
Failed |
44.418s |
raytrace.py |
11.608s |
Failed |
1.228s |
spectral_norm.py: |
14.388s |
118.309s |
1.333s |
pypy編譯除了有顏色背景的數(shù)據(jù),其它測(cè)試結(jié)果基本都是最快的,其中15個(gè)程序代碼測(cè)試結(jié)果所花時(shí)間不到Cpython的十分之一
pypy的缺陷
可以看出pypy實(shí)現(xiàn)python有很大的優(yōu)勢(shì),但是目前來(lái)說(shuō)很多公司的python項(xiàng)目仍然沒(méi)有采用pypy來(lái)實(shí)現(xiàn),原因是
pypy有一個(gè)缺陷:C擴(kuò)展性弱,簡(jiǎn)單理解就是python程序中如果混合了C/C++代碼,調(diào)用了C/C++的庫(kù),就會(huì)導(dǎo)pypy
不支持或者pypy運(yùn)行速度變慢很多。而現(xiàn)在很多項(xiàng)目都是采用C/C++/Python混合編程。
但是pypy也有自己的兼容C/C++的方法(但是沒(méi)有完全解決擴(kuò)展性弱的問(wèn)題),pypy有ctypes和cffi兩種方式來(lái)
進(jìn)行C擴(kuò)展,以下是一些簡(jiǎn)單程序?qū)嶒?yàn):
用ctypes的方式實(shí)現(xiàn)C++,python混合編程,先寫(xiě)一個(gè).cpp然后在python文件中調(diào)用它,最后用Cpython,和pypy分別編譯執(zhí)行都可以跑,說(shuō)明ctypes是支持C++擴(kuò)展的
這次用pypy跑的速度就要Cpython不少了
總結(jié)
以上就是本文關(guān)于聊聊Python中的pypy的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
python 編寫(xiě)簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例
今天小編就為大家分享一篇python 編寫(xiě)簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python Django框架url反向解析實(shí)現(xiàn)動(dòng)態(tài)生成對(duì)應(yīng)的url鏈接示例
這篇文章主要介紹了Python Django框架url反向解析實(shí)現(xiàn)動(dòng)態(tài)生成對(duì)應(yīng)的url鏈接,結(jié)合實(shí)例形式分析了Django框架URL反向解析具體原理與應(yīng)用操作技巧,需要的朋友可以參考下2019-10-10Python 實(shí)現(xiàn)加密過(guò)的PDF文件轉(zhuǎn)WORD格式
這篇文章主要介紹了Python 實(shí)現(xiàn)加密過(guò)的PDF文件轉(zhuǎn)WORD格式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02python實(shí)現(xiàn)畫(huà)五角星和螺旋線的示例
今天小編就為大家分享一篇python實(shí)現(xiàn)畫(huà)五角星和螺旋線的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01PyChar學(xué)習(xí)教程之自定義文件與代碼模板詳解
pycharm默認(rèn)的【新建】文件,格式很不友好,那么就需要改一下文件模板。下面這篇文章主要給大家介紹了關(guān)于PyChar學(xué)習(xí)教程之自定義文件與代碼模板的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面跟著小編來(lái)一起看看吧。2017-07-07pytorch中LN(LayerNorm)及Relu和其變相的輸出操作
這篇文章主要介紹了pytorch中LN(LayerNorm)及Relu和其變相的輸出操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05