聊聊Python中的pypy

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的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • linux 安装pypy , virtualenv及使用方法

    linux 安装 pypy 自己使用的系统是 centos 7(其他linux机器的安装方法类似) 首先下载pypy 的rpm包. http://pkgs.org/search/?keyword=pypy 依次下载 pypy-libs-2.2.1-2.el7.x86_64.rpm pypy-2.2.1-2.el7.x86_64.rpm pypy-devel-2.2.1-2.el7.x86_64.rpm 依次安装,libs 文件一定要先与解释器安装. rpm -ivh pypy-libs-2.2.

  • 聊聊Python中的pypy

    PyPy是一个虚拟机项目,主要分为两部分:一个Python的实现和 一个编译器 PyPy的第一部分: 用Python实现的Python 其实这么说并不准确,准确得说应该是用rPython实现的Python,rPython是Python的一个子集,虽然rPython不是完整的Python,但用rPython写的这个Python实现却是可以解释完整的Python语言. PyPy的第二部分:编译器 这是一个编译rPython的编译器,或者说这个编译器有一个rPython的前端,目前也只有这么一个前端,

  • 聊聊python中的异常嵌套

    在Python中,异常也可以嵌套,当内层代码出现异常时,指定异常类型与实际类型不符时,则向外传,如果与外面的指定类型符合,则异常被处理,直至最外层,运用默认处理方法进行处理,即停止程序,并抛出异常信息.如下代码: try: try: raise IndexError except TypeError: print('get handled') except SyntaxError: print('ok') 运行程序: Traceback (most recent call last): File

  • 聊聊python中的循环遍历

    python之循环遍历 关于循环遍历大家都知道,不外乎for和while,今天我在这写点不一样的循环和遍历.在实践中有时会遇到删除列表中的元素,那么循环遍历列表删除指定元素该怎么做呢? 还是直接上代码看案例吧: import time # 删除下面列表中所有张姓元素,输出的结果应该是['李老大','李老二'] lst = ['张老大', '张老二', '李老大', '张老三', '李老二']*10000 # 直接for循环遍历列表,remove需要删除的元素 def del1(lst): for

  • 聊聊Python中的浮点数运算不准确问题

    大家好,老 Amy 来了.之前就意识到一个问题,但是最近又有朋友提出来了,所以就想着干脆记录下来,分享给大家叭~ 啥问题呢?请看题: 也就是说,需要大家计算1.1-1的值,很多朋友会说:"emmm-这还不简单,玩我呢?不就是0.1嘛" 但是如果你用 python 去执行一下,会发现结果跟你想的不太一样,如下图: 这样大家是不是发现了什么问题?是的,浮点数在运算过程中并没有保证完全精确,是什么原因导致了这种现象呢?很多朋友就会窃喜:"这不就是 Python 的 bug 嘛~&q

  • 聊聊python中not 与 is None的区别

    原因: list 获得的数据为空: 显示值为 [ ] 不同的判断--- is None ----not 两者结果不一样分析: 总之: not 判断的是内容,而is None则涉及到这个 list 或 dict 是否声明并定义 补充:关于Python not 及is None的有趣现象(两者的区别) 笔者小白最近在刷题的过程中,遇到一个有趣的现象. 在使用 if A is None 来实现判断条件的时候,最后程序没有通过.这里的A代表之前定义的list类型的数据.最用改成if not A才通过.

  • 聊聊Python中end=和sep=的区别

    end: 默认是换行,表示两个字符串最后以什么结尾. eg: 换行 end="\n" sep: 默认是空格,表示两个字符串之间用什么分割. eg: 空格 sep=" " 补充:python 中的 print(x, end=) 和 print(x, sep=) print(x, end=) for i in range(10): print(i) 输出结果: 0 1 2 3 4 5 6 7 8 9 for i in range(10): print(i, end=&q

  • 聊聊Python中的@符号是什么意思

    Python中的@符号是装饰器的意思.Python中装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针). 实质:是一个函数 参数:是你要装饰的函数名(并非函数调用) 返回:是装饰完的函数名(也不是函数调用) 作用:为已经存在的对象添加额外的功能. 特点:不需要对对象做任何的代码上的变动. Python装饰器有很多经典的应用场景,比如:插入日志,性能测试,事务处理,权限校验等.装饰器是解决这类问题的绝佳设计. 装饰器

  • 聊聊python中的load、loads实现反序列化的问题

    load与loads 简介: 在python自动化中,我们传递一些参数是需要从文件中读取过来的,读取过来的字典并非python对象数据类型而是string类型. 这样在我们传递参数的时候就会出现格式不正确的情况,这时候就要用到load实现反序列化 python对象数据类型包括list ,dict,tuple,set等 案例1:load load:load主要处理的是文件流 首先我们新建一个txt文件,文件中写入一个字典 {"a":"1","b":

  • 简单聊聊Python中的鸭子类型和猴子补丁

    目录 前言 鸭子类型 猴子补丁 总结 前言 Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已. 我最近在面试候选人的时候,也会问这两个概念,很多人答的也并不是很好.但是当我向他们解释完之后,普遍都会恍然大悟:“哦,是这个啊,我用过”. 所以,我决定来写一篇文章,探讨一下这两个技术. 鸭子类型 引用维基百科中的一段解释: 鸭子类型(duck typing)在程序设计中是动态类型的一种风格.在这种风格中,一个

  • 聊聊python中令人迷惑的duplicated和drop_duplicates()用法

    前言 在算face_track_id map有感: 开始验证 data={'state':[1,1,2,2,1,2,2,2],'pop':['a','b','c','d','b','c','d','d']} frame=pd.DataFrame(data) frame frame.shape $ (8,2) # 说明duplicated()是对整行进行查重,return 重复了的数据,且只现实n-1条重复的数据(n是重复的次数) frame[frame.duplicated() == True]

随机推荐