聊聊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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
Python使用matplotlib绘制动画的方法
May 20 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
python获取命令行输入参数列表的实例代码
Jun 23 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
Python用类实现扑克牌发牌的示例代码
Jun 01 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 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 @ at 记号的作用示例介绍
2014/10/10 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
通过C++学习Python
2015/01/20 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python and、or以及and-or语法总结
2015/04/14 Python
Python selenium文件上传方法汇总
2020/11/19 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
python爬取微信公众号文章的方法
2019/02/26 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
土木工程实习生自我鉴定
2013/09/19 职场文书
自荐信的格式
2014/03/10 职场文书
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电
Redis Lua脚本实现ip限流示例
2022/07/15 Redis