这篇文章主要介绍了聊聊 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 的全部内容, 希望对大家有所帮助感兴趣的朋友可以继续参阅本站其他相关专题, 如有不足之处, 欢迎留言指出感谢朋友们对本站的支持!
来源: http://www.phperz.com/article/18/0223/362736.html