聊聊Python中的pypy


Posted in Python onJanuary 12, 2018

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性能测试

聊聊Python中的pypy

聊聊Python中的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++扩展的

聊聊Python中的pypy

聊聊Python中的pypy

聊聊Python中的pypy

这次用pypy跑的速度就要Cpython不少了

总结

以上就是本文关于聊聊Python中的pypy的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python+django实现文件上传
Jan 17 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
opencv3/C++图像像素操作详解
Dec 10 Python
python logging.basicConfig不生效的原因及解决
Feb 20 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
PyInstaller运行原理及常用操作详解
Jun 13 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
python实现web邮箱扫描的示例(附源码)
Mar 30 Python
Python django中如何使用restful框架
Jun 23 Python
Python中实现switch功能实例解析
Jan 11 #Python
Python中getpass模块无回显输入源码解析
Jan 11 #Python
python版微信跳一跳游戏辅助
Jan 11 #Python
微信跳一跳python辅助脚本(总结)
Jan 11 #Python
Python用sndhdr模块识别音频格式详解
Jan 11 #Python
Python用imghdr模块识别图片格式实例解析
Jan 11 #Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 #Python
You might like
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
PHP.vs.JAVA
2016/04/29 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
Python实现单词翻译功能
2017/06/06 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
CSS3制作日历实现代码
2012/01/21 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
优秀应届生推荐信
2013/11/09 职场文书
中专毕业生自我鉴定范文
2013/11/09 职场文书
业务助理岗位职责
2013/11/18 职场文书
好家长事迹材料
2014/01/23 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
大学开学感言
2015/08/01 职场文书