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性能测试
i
Cpython2.7.6,pyston0.2,pypy2.2.1的性能对比,使用的是pyston源代码目录下的minibenchmarks和microbenchmarks中
的python代码来跑,对比结果如下表所示
|
Cpython2.7.6 |
pyston0.2 |
Pypy2.2.1 |
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 |
|