为什么 PyPy 没有包含在标准 Python 中?

2024-02-29

我在看PyPy http://pypy.org/我只是想知道为什么它没有被主流 Python 发行版采用。像 JIT 编译和更低的内存占用这样的东西不会大大提高所有 Python 代码的速度吗?

简而言之,PyPy 的主要缺点是什么导致它仍然是一个单独的项目?


PyPy 不是 CPython 的分支,因此它永远无法直接合并到 CPython 中。

理论上Python社区可以普遍采用PyPy,PyPy可以作为参考实现,而CPython可以停止使用。然而,PyPy 也有其自身的弱点:

  • CPython 很容易与用 C 编写的 Python 模块集成,这是 Python 应用程序处理 CPU 密集型任务的传统方式(例如,请参阅 SciPy 项目)。
  • PyPy JIT 编译步骤本身会消耗 CPU 时间——只有通过重复运行编译后的代码,整体速度才会变得更快。这意味着启动时间可能会更长,因此 PyPy 不一定能够高效地运行粘合代码或简单的脚本。
  • PyPy 和 CPython 的行为并非在所有方面都相同,尤其是在“实现细节”(语言未指定但在实践层面仍然很重要的行为)方面。
  • CPython 比 PyPy 可以在更多架构上运行,并且已成功适应以 PyPy 可能不切实际的方式在嵌入式架构中运行。
  • CPython 的内存管理引用计数方案可以说比 PyPy 的各种 GC 系统具有更可预测的性能影响,尽管并不一定适用于所有“纯 GC”策略。
  • PyPy 尚未完全支持 Python 3.x,尽管这是一个活跃的工作项目。

PyPy 是一个伟大的项目,但 CPU 密集型任务的运行速度并不是一切,在许多应用程序中,它只是众多问题中最不重要的一个。例如,Django 可以在 PyPy 上运行,这使得模板化速度更快,但 CPython 的数据库驱动程序比 PyPy 的更快;最后,哪种实现更有效取决于给定应用程序的瓶颈所在。

另一个例子:您可能认为 PyPy 非常适合游戏,但大多数 GC 策略(例如 PyPy 中使用的策略)会导致明显的抖动。对于 CPython,大多数 CPU 密集型游戏内容都被卸载到 PyGame 库,PyPy 无法利用该库,因为 PyGame 主要作为 C 扩展实现(尽管请参阅:pygame-cffi)。我仍然认为 PyPy 可以成为一个很棒的游戏平台,但我从未见过它实际使用。

PyPy 和 CPython 对基本设计问题采用截然不同的方法,并做出不同的权衡,因此在每种情况下,两者都不比另一个“更好”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 PyPy 没有包含在标准 Python 中? 的相关文章

随机推荐

  • Vue2 在通过 Axios 接收的列表中搜索

    由于过滤比 Vue 1 中的过滤要复杂得多 所以我有一个问题 这是我的组件 其中显示了羊列表 并提供了搜索 过滤名称或家族的选项 但我不知道如何实现这一目标
  • 如何将配置变量发送到 py.test 测试?

    我有一个测试套件需要与多个后端一起运行 但这不是一个简单的参数化测试 因为它适用于整个套件 多个文件 模块 我可以通过环境控制运行 但我想知道 py test 是否有更清晰的方式来表达这一点 也就是说 我正在寻找这样的东西 py test
  • 如何将 hasOne 关系与嵌入的always关系建立起来

    EmberJS 在早期版本中删除了 hasOne 在我想要 hasOne 的地方创建这样的嵌套对象关系的方法是什么 已经删除了 hasOne 以支持 ownTo 任何人都可以分享一下如何在嵌套 JSON 之间编写 embedded alwa
  • 如何将 C++ 静态库链接到 C 程序?

    我有以下 C 程序 Client h ifndef Client Client h define Client Client h include Client h class Client public void f1 void f2 en
  • Vim 中切换回上一个窗口的快捷方式?

    Ctrlw1w switches to the first window 如果目前我经常在几个窗口中的两个中进行编辑 那么切换回最后一个活动窗口的快捷方式将是完美的 有这样的捷径吗 你试过了吗
  • javascript 动态 HTML 表格行导致问题

    我有一个select option在选择其中我创建一个 HTML 表 因为我根据所选选项从后端调用数据 所以创建的表行是动态的 我正在做的是 在更改选择选项时 我正在创建 HTML 表格行 这些行是动态的并且由输入字段组成 ItemName
  • “mod”Haskell 上的语法错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在关注 haskell 教程 http www seas upenn edu cis194 lectures 01 intro
  • Autohotkey 脚本使用命令行参数运行程序

    我正在使用自动热键来自动化一些手动过程 我必须运行一个接受几个命令行参数的java命令行程序 java 我想在自动化中执行一些预定义的任务后从 autohotkey 运行这个 java 程序 我该怎么做 我认为这就是您正在寻找的 在此示例中
  • OAuth2 与 Spring Security - InsufficientAuthenticationException

    我目前正在开发一个涉及 Spring Security 针对 OAuth2 的项目 我们正在使用授权码流程 但是 当客户端点击 AuthorizationEndpoint oauth authorize 时 我们得到一个 Insuffici
  • 是否可以让 LaTeX 链接到图形的顶部而不是其标题?

    在我的 TeX 文件中 我有以下代码 begin figure H begin center includegraphics width 5in screens main png caption label fig MainScreen S
  • 如何在 Objective-c 中将数组声明为常量?

    以下代码给我错误 constants h extern NSArray const testArray constants m NSArray const testArray NSArray arrayWithObjects foo bar
  • 教义:如何取消设置(SET NULL)OneToMany关系

    这是一个非常非常简单的行为 但我却找不到用教义来实现的方法 我将解释它仅用两个实体来降低复杂性 有两个相关的实体 作者和书籍 例如 一位作者拥有零本或更多书籍 和 一本书籍由零位或一位作者拥有 我试图取消作者与其一本书籍之间的关系 来自作者
  • 使用 Passport 和 OAuth2 + 社交网络的 NodeJS REST 身份验证

    我正在尝试RESTapi使用NodeJS 为了进行身份验证 我决定使用Passport 我想要真正的 RESTful api 所以这意味着我必须使用令牌而不是会话 我想让用户使用用户名和密码登录 或者使用 Facebook Google 和
  • 我应该选择 Apache Click 还是 Tapestry 5?

    我要决定是使用 Apache Click 还是 Apache Tapestry 5 框架 我应该选择哪一个 我正在寻找一个可以在未来几年用于构建 Java EE Web 应用程序的框架 接下来的几天 我将测试它们运行示例和自定义项目 但我想
  • cudaGraphicsGLRegisterImage 中 cudaGraphicsRegisterFlagsWriteDiscard 的用例是什么?

    我对 CUDA 相当陌生 但我已经设法使用 OpenGL 在屏幕上显示内核生成的内容 我尝试了几种方法 使用 PBO 和 OpenGL 纹理 旧式 使用 OpenGL 纹理作为 CUDA 表面并在四边形上渲染 新样式 使用渲染缓冲区作为 C
  • awk,打印以四位数字开头的行

    我想打印文件中以四位数字开头的所有行 我尝试了这个 allredy 但它不起作用 cat data txt awk posix if 1 0 9 4 print 1 没有生成输出 下一行打印以数字开头的所有行 cat data txt aw
  • 我该如何解决这个问题?单元类型存在于两个dll文件中

    我目前正在学习使用 Visual Studio 11 beta 的教程 当尝试在我的一个类中设置字段值的最大长度时 MaxLength 50 public string LastName get set 它出错并且不会让我编译 因为MaxL
  • 如何在 .NET 中使用成员身份重命名角色?

    我正在使用 ASP NET 会员资格 并注意到其中没有方法角色类 http msdn microsoft com en us library system web security roles members aspx to modify角
  • 如何在终端中删除 github 帐户

    我想在 Mac 终端上删除原来的 github 帐户并切换到新的 github 帐户 我怎样才能做到这一点 您可以通过在终端中执行以下命令 使用凭据助手来擦除钥匙串条目 git credential osxkeychain erase ho
  • 为什么 PyPy 没有包含在标准 Python 中?

    我在看PyPy http pypy org 我只是想知道为什么它没有被主流 Python 发行版采用 像 JIT 编译和更低的内存占用这样的东西不会大大提高所有 Python 代码的速度吗 简而言之 PyPy 的主要缺点是什么导致它仍然是一