pypypy python_聊聊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ě)的解釋器,因此它能加載用戶(hù)的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ì)本站的支持!
總結(jié)
以上是生活随笔為你收集整理的pypypy python_聊聊Python中的pypy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有小数点的补码怎么算_写给投资小白,指数
- 下一篇: 将指定的计数添加到信号量中会导致其超过_