使用PyPy加快Python程序执行速度

1,815 阅读4分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

Python可以说是近年来比较火的编程语言之一了,Python的优点就不多说了,写过Python的同学应该都有所体验,Python独有的一些特性,写起来真实太舒服了,但是老实讲,Python也没有像各种广告上说的那样,上天入地、开发办公,无所不能的,而且相对其他语言也是有劣势存在的,比如对于某些应用程序来说,Python的运行速度可能比其它语言低上百倍。对于对响应速度有一定要求的系统来说,Python不一定是最好的选择,我就经历过负责的Python项目被使用Java重构,重构的原因是响应速度没有达到期待的效果。那么有没有方法可以提高Python的运行速度呢?那就是使用PyPy。

PyPy是什么

Python的官方解释器是CPython解释器,是用C语言开发实现的,所以叫CPython。CPython是至今为止使用最广泛、也是维护的最好的Python解释器。也有其他语言实现的解释器,如IPython:基于CPython之上的交互式解释器;Jython:使用Java语言实现的解释器;PyPy也是其中之一,pypy使用了即时编译( just-in-time compilation),即JIT编译,可以对Python代码进行动态编译,加速执行速度,同时与Cpython高度兼容,语法也基本一致。

使用PyPy

安装及使用

根据自己的系统下载压缩包: Download and Install 此处以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.
>>>>

官网文档:Downloading and Installing PyPy — PyPy documentation

安装完毕之后,我们的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吧。

最后,感谢女朋友在工作和生活中的包容、理解与支持 !