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

pypypy python_聊聊Python中的pypy相关推荐

  1. python遍历循环怎么理解_聊聊python中的循环遍历

    python之循环遍历 关于循环遍历大家都知道,不外乎for和while,今天我在这写点不一样的循环和遍历.在实践中有时会遇到删除列表中的元素,那么循环遍历列表删除指定元素该怎么做呢? 还是直接上代码 ...

  2. 动量策略 python_在Python中使用动量通道进行交易

    动量策略 python Most traders use Bollinger Bands. However, price is not normally distributed. That's why ...

  3. global在python_在Python中使用“global”关键字

    在Python中使用"global"关键字 我从阅读文档中了解到,Python有一个单独的函数命名空间,如果我想在该函数中使用全局变量,我需要使用global. 我正在使用Pyth ...

  4. 怎么把竖列中的数相加python_关于python中pandas.DataFrame对行与列求和及添加新行与列示例代码...

    pandas是python环境下最有名的数据统计包,而DataFrame翻译为数据框,是一种数据组织方式,这篇文章主要给大家介绍了关于python中pandas.DataFrame对行与列求和及添加新 ...

  5. 取模是什么意思python_原来Python中的取模运算方法竟然是这样的!

    今天小编就为大家分享一篇Python中的取模运算方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 所谓取模运算,就是计算两个数相除之后的余数,符号是%.如a % b就是计算a除以b ...

  6. python减法精确度不准是什么问题,聊聊Python中的浮点数运算不准确问题

    大家好,老 Amy 来了.之前就意识到一个问题,但是最近又有朋友提出来了,所以就想着干脆记录下来,分享给大家叭~ 啥问题呢?请看题: 也就是说,需要大家计算1.1-1的值,很多朋友会说:"e ...

  7. 离散小波变换 python_用python中的“haar”小波对图像进行离散小波变换

    我试图在python中的图像上应用haar小波.这是代码from pywt import dwt2, idwt2 img = cv2.imread('xyz.png') cA, (cH, cV, cD ...

  8. lambda在python_在Python中使用lambda高效操作列表的教程

    介绍 lambda Python用于支持将函数赋值给变量的一个操作符 默认是返回的,所以不用再加return关键字,不然会报错 result = lambda x: x * x result(2) # ...

  9. isdigit函数python_在Python中处理字符串之isdigit()方法的使用

    在Python中处理字符串之isdigit()方法的使用 更新时间:2015年05月18日 12:06:29 投稿:goldensun 这篇文章主要介绍了在Python中处理字符串之isdigit() ...

最新文章

  1. linux手动释放内存的方法
  2. QS世界大学学科排名公布,清华22个学科进入世界50强
  3. Factory模式与Prototype模式的异同
  4. 数据结构(C语言实现)勘误
  5. python让用户输入字符串_当用户输入字符串而不是整数时,如何保护我的python代码?...
  6. jQuery图表开源软件
  7. 容器编排技术 -- Kubernetes kubectl create serviceaccount 命令详解
  8. ios上传图片 java_iOS ASIFormDataRequest上传图片 前后台代码
  9. 小朵机器人安卓叫什么_小朵机器人App
  10. Caffe框架的使用
  11. linux aria2 使用教程,Aria2安装配置使用教程
  12. mysql 将中文转换成拼音_mysql 如何将中文转拼音
  13. [android基础知识] 之十三: Runtime.getRuntime()
  14. Jquery中fadein() fadeout()方法的使用
  15. 生存或毁灭? 国内DIY现状大型调查分析
  16. Java随笔记 - 实现一个自定义的BitMap
  17. arm搭建云手机教程_自己能不能搭建云手机平台?
  18. 药学要学python吗_大一医学生有无必要学Python?
  19. Gradle sync failed: No variants found for ':app'. Check build files to ensure at least one varian...
  20. 晋拓股份上交所上市:市值26亿 张东家族企业色彩浓厚

热门文章

  1. C# 各版本更新简介
  2. ChartDirector Python创建建多层甘特图的代码
  3. MED-V服务器部署,MED-V服务器系列之一
  4. 2- 计算机的组成,VMware使用
  5. Oracle 10g OCP认证资料(官方教材与考试题库)下载
  6. (WPF, MVVM) Event 处理
  7. iptables 实际操作 之 规则查询 2
  8. 第六章,文本处理工具和正则表达式
  9. C++socket网络编程(跨平台)实战HTTP服务器(三)
  10. 钉钉微应用的开发——主前端