【问题标题】:Does pypy handle threads and sockets quickly compared to hand written C?与手写 C 相比,pypy 是否可以快速处理线程和套接字?
【发布时间】:2012-03-16 02:05:49
【问题描述】:

与手写 C 相比,pypy 处理线程和套接字的速度是否更快?和普通的python相比?

我会尝试一下,但是有问题的 python 代码是为我不是管理员的一小群计算机编写的。我在这里问是因为我在谷歌上的尝试只提供了与 cython、空载燕子等的比较,如果这不太可能奏效,我不想让管理员为此烦恼。

我实际上并不需要 pypy 一样擅长 C;我正在寻找使用它,因为现在解释器的开销完全掩盖了我试图计时的计算。我只需要 pypy 就能让我靠近手写 C。

【问题讨论】:

  • 你有没有考虑过用一个小脚本试试?
  • “等待套接字”或“启动和停止线程”真的是应用程序的 CPU 绑定性能瓶颈吗?如果是,您可能希望使用 select() 等待套接字并摆脱并行尝试。您是否对原始代码进行了分析?
  • 它肯定会更慢(除非你使用一些不错的库来击败 C 程序中包含的库)。 JIT 是一个不错的功能,但访问时间仍然会受到影响,并且 JIT 可以使用更多的内存。不过,我不喜欢使用垃圾收集器的网络事物。
  • 你怎么知道解释器开销占主导地位?如果你在集群上运行这个程序,你为什么要使用线程?如果您已经使用套接字与其他机器上的实例共享数据,为什么不使用套接字和多处理模块在一台机器上运行多个实例呢?这将使您绕过全局解释器锁定。

标签: python c multithreading sockets pypy


【解决方案1】:

与手写 C 相比,pypy 处理线程和套接字的速度是否更快?

没有。通常情况相同或更糟。

PyPy 保留了 CPython 拥有的全局解释器锁 (GIL)。这意味着本机线程无法并行运行 Python 代码。 Python 线程还具有额外的语义,这些语义是有代价的。许多同步都围绕着 Python 线程的启动、关闭和线程对象的跟踪。相比之下,C 线程启动速度更快,使用成本更低,并且可以完全并行运行。

高效的套接字处理需要最大限度地减少等待下一个套接字事件的时间。由于 PyPy 的线程模型仍受 GIL 约束,这意味着从阻塞套接字调用返回的线程在获得 GIL 之前无法继续。等效的 C 代码通常执行得更快,并且可以更快地返回到等待套接字事件。

与普通的python相比?

是的。但不多。

由于上述原因,PyPy 将需要更少的 CPU 时间来处理等效代码,但由于 JIT 和其他开销导致的偶尔峰值除外。因此,线程和套接字处理都更快、响应更快。

我会尝试一下,但是有问题的 python 代码是为我不是管理员的一小群计算机编写的。我在这里问是因为我在谷歌上的尝试只提供了与 cython、空载燕子等的比较,如果这不太可能奏效,我不想让管理员为此烦恼。

只有当您的代码受 CPU 限制时,PyPy 才会显着提高性能。 PyPy 是我所知道的fastest Python 实现,它可以在本地运行。您可以调查一些other implementations,或者如果真正的线程并行性对您来说是一个高优先级,则可以考虑编写 C 扩展。

我实际上并不需要 pypy 一样擅长 C;我正在寻找使用它,因为现在解释器的开销完全掩盖了我试图计时的计算。我只需要 pypy 就能让我靠近手写 C。

用 C 缩小性能差距是目前 PyPy 的最大特点。我强烈建议您尝试一下。

【讨论】:

  • 我最终只是尝试了 pypy,不幸的是它并没有显着加快速度,我不得不用 C 重写代码。感谢您的帖子,它提供了非常丰富的信息。
  • @blackfedora:嘿,我很高兴 :)。你会因为努力让它工作而成为一个更好的程序员。
【解决方案2】:

问题不在于调用标准 API 中的例程,而在于其间的 pypy 处理。 pypy 处理越少,您就越接近 C 速度(因为一旦执行进入实际的 API 代码,执行速度就没有差异)。不过我不会期待奇迹。

我发现 this comparison 了解不同的编程语言如何相互竞争,虽然不包括 pypy,但 python 在原始速度方面做得很好,也没有做得很好。

【讨论】:

  • 编程语言没有性能特征;执行机器做。这就是为什么这个问题问的是 PyPy,而不是 CPython。
  • 除非您在处理器中运行所有程序,否则会有更多的执行机制。 CPython 和 PyPy 不是一回事,众所周知,它们具有不同的性能特征。
  • 要了解 PyPy 的性能如何与 CPython 完全不同,请参阅 bluemoon 建议的 speed.pypy.org。
  • @OlofForshell 在我说话之前我失去了你,因为你不知道这里发生了什么。 Python是一种语言; pypy 和 cpython 是 python 执行机制的实现。没有 C 与 python 的性能比较之类的东西,因为它们是一组抽象的规则。有执行机器的性能比较,所以 C 编译使用例如GCC 运行在例如Windows 7,运行在例如x84-64 vs Python 运行在例如CPython 运行在例如Windows 7,运行在例如x84-64。您链接到使用 CPython 3.2.2 的比较。
  • @OlofForshell 你故意装傻吗?我绝不是说不可能衡量从 C 代码生成的特定可执行文件的性能 - 我是说这是唯一可能的衡量标准,因为没有衡量语言性能之类的东西。
【解决方案3】:

它应该相当快地处理套接字和线程,我不能保证它会像 C 一样快,PyPy 使用守卫来确保值可以在 C 函数中运行。因为 PyPy 使用 JIT,它会在大循环的情况下提供最大的性能增益。你可以看看pypy's speed tests here

【讨论】:

  • 我看到了这些基准,但希望看到一些将 pypy 与 c 和 python 进行比较的结果,因为这类最新的基准可以追溯到许多版本的 pypy。我将继续尝试 pypy;我将在这里发布至少一些比较 pypy 和 python 的基准。
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 2018-05-19
  • 1970-01-01
  • 2011-02-10
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多