您好,登录后才能下订单哦!
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的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。