我们都知道用Python编写的程序运行速度并不快,这很好,但是为了获得更高的性能,我们是否需要切换到另一种编程语言?不必要。我们可以放弃python.py的运行方式,改用PyPy即时编译器。根据官方网站,即使是Python的创建者GuidovonRossum也建议将PyPy用于性能关键的Python程序。接下来我们看看PyPy有多快。基准如何工作为了比较Python和PyPy,我编写了几个Python程序。众所周知的算法、典型用例,甚至是基本的HTTP服务器。然后我用Python和PyPy执行程序——在macOS和Linux上使用终端中的时间模块,我可以看到执行某些东西的持续时间。使用时间模块看起来像这样:在timepython.py完成执行后,时间模块报告您花费的时间。使用的版本:PyPy:7.3.5,使用Python版本3.7.10Python:版本3.9.7两个版本都是目前最新的。该程序本身不记录任何内容。我们只关心做计算。这是准备好的代码片段。让我们对每个场景进行基准测试。1.Fibonacci以下函数生成我们传递给它的数字的Fibonacci值。结果:Python的平均执行时间为2337毫秒。PyPy平均只需要301毫秒。明显的赢家是PyPy。2.WebServices为了衡量PyPy和Python在处理HTTP请求方面的性能,使用time命令测量时间是行不通的。有效的是“wrk”——一种在服务器上触发大量HTTP请求的基准测试工具。因此,它为我们提供了有关服务器平均响应速度以及它可以处理多少HTTP请求的数据。上面显示的Web服务器在端口4000上为目录“app”提供服务。在这个目录中,我创建了一个小的hello-worldHTML文件。基准测试在终端中执行:wrk-t12-c400-d10shttp://localhost:4000/结果如下:Python:Web服务器平均每秒可处理995个请求,平均延迟为2.03毫秒。PyPy:Web服务器平均每秒可以处理1481个请求,平均延迟为1.90毫秒。如您所见,PyPy的速度要快得多。3.快速排序快速排序可能是最高效的排序算法。这是它在Python中的实现:在Quicksort实现下面,我们生成500个随机数并将它们存储在一个数组中。这个数组就是Quicksort算法要排序的。结果如下:Python:代码平均执行时间为43毫秒PyPy:平均执行时间为132毫秒。是的,Python在这里更快。这也可以在内部测量时间时使用start=time.time()技巧来确认。4.栈栈是一种简单的数据结构。这是数组的一个更漂亮的词,我们将东西推到它上面并从中弹出。下面的代码创建了这个数组,在堆栈上压入和弹出1000万个数字:让我们看看两者的速度有多快。Python:代码平均耗时2.89秒PyPy:平均69毫秒。是的,我说的是毫秒。在此基准测试中,PyPy比普通Python快几个数量级。5.SQlite3Database数据库是大型项目中常用的东西。我选择SQLite作为基准测试,因为它很容易与Python一起使用——无需通过pip安装任何东西。以下代码在基于文件的SQLite数据库中创建一个新表。在每个基准测试之前,我删除数据库文件并创建一个普通的新文件。但是数据库存储什么?范围函数生成一百万个数字,然后将每个数字加倍-函数f(n)=n*2。数据库存储每个函数对,例如“2,4”或“18,36”。结果:Python平均需要6.7秒来执行代码。PyPy平均需要9.4秒来执行。Python更快。我还尝试将它与其他操作结合起来——比如删除我刚刚创建的条目。它没有改变结果。对于SQlite3数据库,Python比PyPy更快。总的来说,这让我感到惊讶。当Python击败PyPy时,这不是数量级的问题。由于我不是Python或PyPy专家,我不确定为什么Python在某些情况下更好。可能因为PyPy是一个JIT编译器,所以在运行时,它首先编译代码。另一方面,默认的Python解释器不会这样做。因此,对PyPy不利的是,JIT编译增加了一些所需的时间。尽管如此,PyPy在某些情况下提供了更快的执行速度。如您所见,它在五分之三的情况下提供了更快的执行速度。原文:https://louispetrik.medium.com/pypy-vs-python-49153daca65c
