使用PyPy加快Python程序执行速度
PyPy是什么
Python的官方解释器是CPython解释器,是用C语言开发实现的,所以叫CPython。CPython是至今为止使用最广泛、也是维护的最好的Python解释器。也有其他语言实现的解释器,如IPython:基于CPython之上的交互式解释器;Jython:使用Java语言实现的解释器;PyPy也是其中之一,pypy使用了即时编译( just-in-time compilation),即JIT编译,可以对Python代码进行动态编译,加速执行速度,同时与Cpython高度兼容,语法也基本一致。
使用PyPy
安装及使用
根据自己的系统下载压缩包:
此处以linux版本为例。下载完毕之后进行解压:
tar xf pypy3.7-v7.3.5-linux64.tar.bz2 ./pypy3.7-v7.3.5-linux64/bin/pypy3.7 Python 3.7.10 (77787b8f4c49, May 15 2021, 11:50:33) [PyPy 7.3.5 with GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux Type "help", "copyright", "credits" or "license" for more information. >>>>
官网文档:
安装完毕之后,我们的python代码就可以通过PyPy去执行。 只有PyPy也是不够的,还需要安装一些别的库,需要先安装PyPy的pip: 使用pypy3 -m ensurepip进行安装。
安装完毕之后PyPy的bin目录下会有pip3及pip3.7,我们就可以通过它们来安装我们需要的其他的库了。
与CPython对比
新建test.py,写入以下代码,分别使用CPython解释器和PyPy解释器运行test.py文件,对比一下运行时间。
import time start = time.time() for j in range(10000): for i in range(10000): total = i * j end = time.time() print("运行时间:", end - start)
CPython:
python test.py 运行时间: 11.55064606666565
PyPy:
./pypy3.7-v7.3.5-linux64/bin/pypy3.7 test.py 运行时间: 0.250166654586792
通过结果可以看出PyPy的运行速度确实要比CPython快很多。
PyPy的局限性
看到这里,可能会想,PyPy运行速度比CPython要快,代码语法也基本兼容,为什么没有取代CPython或者没有被广泛使用呢?那是因为PyPy虽然运行速度快,但是也有局限性。下面就来简单说一下。
不适用于C扩展
PyPy适用于使用纯Python代码编写的程序,但是只要用到了C扩展库(如Numpy、SciPy等),它的运行速度不仅不会加快,反而会比使用CPython慢。原因是C扩展库都是基于CPython设计实现的,PyPy还不完全支持C扩展库,没办法对使用C扩展的程序进行优化,进而会变慢。PyPy官方今年来也在处理C扩展库的问题,有些扩展库已经被移植到PyPy,但是还是有一定劣势的。所以如果你的应用程序中使用的C扩展库,还是使用CPython解释器比较好。
生态问题
Python第三方库可以说非常丰富且强大了,而这些库大都是基于CPython实现的,PyPy兼容的库真是少之又少,这样使用的人也就很少,也就没有很多开发者为PyPy做出贡献,导致兼容的库越来越少,这就是一个恶性的循环。简单来说,就是生态不行。
PyPy不适合短时间运行的程序
如果程序运行的时间越长,PyPy可以收集更多的运行时的信息并对程序的执行做出更多的优化。 但是如果一个程序没有运行至少几秒钟,那么PyPyJIT编译器将没有足够的时间来预热,不仅不会加快运行速度,反而会变慢。
总结
如果你的项目是纯Python编写的业务系统,那么可以尝试一下PyPy,或许有意想不到的效果,如果有用到C扩展模块,那还是老老实实使用CPython吧。