当前位置:首页 > 技术分析 > 正文内容

PyPy是不是真的比Python快?(pygame和python)

ruisui883个月前 (02-03)技术分析19

众所周知, Python 编写的程序运行不快,这种慢虽无大碍,但为了获得更高的性能,我们需要再切换到另一种编程语言吗?不一定。我们可以放弃python.py的运行方式,转而使用 PyPy 即时编译器。


根据官方网站的说法,就连Python 创建者 Guido von Rossum 都建议将 PyPy 用于关键性能的 Python 程序。接下来我们看看 PyPy 有多快。


基准测试的工作原理


为了比较 Python 和 PyPy,我编写了几个 Python 程序。著名算法、典型用例,甚至是基本的 HTTP 服务器。然后我用 Python 和 PyPy 执行程序——在 macOS 和 Linux 的终端中使用time模块,可以看到执行某事的持续时间。使用 time模块 看起来像这样:

time python.py


执行完成后,time模块会报告您花费的时间。

使用的版本:

PyPy:7.3.5,使用 Python 版本 3.7.10

Python:版本 3.9.7


这两个版本都是目前可用的最新版本。程序本身不记录任何内容。我们只关心进行计算。

这是准备好的代码片段。让我们对每个场景进行基准测试


1. 斐波那契


以下函数生成我们传递给它的数字的斐波那契值。


结果:

Python 平均需要 2337 毫秒的执行时间。

PyPy 平均只需要 301 毫秒。明显的赢家是 PyPy。


2. web服务


为了对 PyPy 和 Python 处理 HTTP 请求的性能进行基准测试,使用 time 命令测量时间是行不通的。有效的是“wrk”——一个基准测试工具,在服务器上触发大量 HTTP 请求。


因此,它为我们提供了有关服务器平均响应速度以及它可以处理多少 HTTP 请求的数据。


上面显示的 Web 服务器在端口 4000 上为目录“app”提供服务。在这个目录中,我创建了一个小的 hello-world HTML 文件。基准测试在终端中执行:

wrk -t12 -c400 -d10s http://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. SQlite3 Database


数据库是大型项目中常用的东西。我选择 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 在某些情况下提供了更快的执行速度。 如您所见,它在 5 种情况下的 3 种情况下提供了更快的执行。



原文:https://louispetrik.medium.com/pypy-vs-python-49153daca65c

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1210.html

标签: pypy3
分享给朋友:

“PyPy是不是真的比Python快?(pygame和python)” 的相关文章

Vue组件通信之props深入详解!

props 是 Vue 组件中一个很重要的概念。它是用来从父组件向子组件传递数据的。为什么需要props?这是因为在Vue中,组件是相互隔离的。每个组件都有自己的作用域,子组件无法直接访问父组件的状态或值。通过props,父组件可以将数据传递给子组件。使用props的步骤:1. 在子组件中定义pro...

vue:组件中之间的传值

一、父子组件之间的传值----props/$emit1、父组件向子组件传值--props2.子组件想父组件传值-this.$emit('select',item)二、父组件向下(深层)子组件传值----provide/injectprovide:Object | () => O...

深入理解Vue.js组件通信:父子组件与子父组件数据交互详解

什么是Vue组件通讯 Vue.js 组件通信是指在 Vue 应用的不同组件之间进行数据交换和状态同步的过程。由于 Vue 的组件是基于单文件组件(SFCs)的模块化设计,每个组件都有自己的作用域,因此它们不能直接访问彼此的数据。为了使组件之间能够协同工作,Vue 提供了几种不同的通信方式。以下是 V...

身体越柔软越好?刻苦拉伸可能反而不健康 | 果断练

坐下伸直膝盖,双手用力向前伸,再用力……比昨天前进了一厘米,又进步了! 这么努力地拉伸,每个人都有自己的目标,也许是身体健康、线条柔美、放松肌肉、体测满分,也可能为了随时劈个叉,享受一片惊呼。 不过,身体柔软,可以享受到灵活的福利,也可能付出不稳定的代价,并不是越刻苦拉伸越好。太硬或者太软,都不安全...

《暗黑破坏神 2:重制版》PC 版 2.3 版本发布,支持英伟达 DLSS

IT之家 12 月 3 日消息,暴雪为《暗黑破坏神 2:重制版》PC 版发布了更新 2.3 版本,添加了“离线难度缩放”滑块(玩家可以在单人游戏时增加挑战和奖励的级别)、多项辅助功能和用户界面改进,以及英伟达 DLSS 支持。玩法改进:玩家现在可以在离线游戏的选项菜单中使用“游戏难度等级”,它提供与...

别让“跑焦”毁所有!仅需这一项设置,即可显著改善镜头对焦精度

我常常会收到一些摄影爱好者的私信,也一直在努力的帮助大家解决更多摄影中常见问题。在我收到的所有问题中。有一个问题是最麻烦的,那就是“为什么我的图像看起来模糊?”。这个问题几乎每个人都遇到过,究其原因可以说是多种多样相对复杂。起初我一直认为是对焦问题所导致,也就有了我之前所写的“后按对焦”以及“对焦模...