聊聊Python中的pypy
Python  /  管理员 发布于 7年前   374
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代码来跑,对比结果如下表所示
| 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编译除了有颜色背景的数据,其它测试结果基本都是最快的,其中15个程序代码测试结果所花时间不到Cpython的十分之一
pypy的缺陷
可以看出pypy实现python有很大的优势,但是目前来说很多公司的python项目仍然没有采用pypy来实现,原因是
pypy有一个缺陷:C扩展性弱,简单理解就是python程序中如果混合了C/C++代码,调用了C/C++的库,就会导pypy
不支持或者pypy运行速度变慢很多。而现在很多项目都是采用C/C++/Python混合编程。
但是pypy也有自己的兼容C/C++的方法(但是没有完全解决扩展性弱的问题),pypy有ctypes和cffi两种方式来
进行C扩展,以下是一些简单程序实验:
用ctypes的方式实现C++,python混合编程,先写一个.cpp然后在python文件中调用它,最后用Cpython,和pypy分别编译执行都可以跑,说明ctypes是支持C++扩展的
这次用pypy跑的速度就要Cpython不少了
总结
以上就是本文关于聊聊Python中的pypy的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号