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

Python 与手写C相比,pypy处理线程和套接字的速度快吗?,python,c,multithreading,sockets,pypy,Python,C,Multithreading,Sockets,Pypy,与手写C相比,pypy处理线程和套接字的速度快吗?与普通python相比 我只是想尝试一下,但讨论中的python代码是为一个小型计算机集群编写的,我不是该集群的管理员。我在这里问这个问题是因为我在谷歌上的尝试只提供了与cython、UnladenSwallow等的比较,如果这不太可能奏效的话,我不想打扰管理员 我其实不需要pypy在C上表现得那么好;我希望使用它,因为现在解释器的开销完全盖过了我试图计算时间的计算。我只需要pypy来让我熟悉手写C。它应该可以相当快地处理套接字和线程,我不能保证

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

我只是想尝试一下,但讨论中的python代码是为一个小型计算机集群编写的,我不是该集群的管理员。我在这里问这个问题是因为我在谷歌上的尝试只提供了与cython、UnladenSwallow等的比较,如果这不太可能奏效的话,我不想打扰管理员


我其实不需要pypy在C上表现得那么好;我希望使用它,因为现在解释器的开销完全盖过了我试图计算时间的计算。我只需要pypy来让我熟悉手写C。它应该可以相当快地处理套接字和线程,我不能保证它会和C一样快,pypy使用保护来确保值可以在C函数中运行。因为PyPy使用JIT,所以在大循环的情况下,它将提供最大的性能增益。您可以看看

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

我发现了不同编程语言之间的差异,虽然pypy没有包括在内,但python在原始速度方面做得并不好

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

不,通常都一样或更糟

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

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

与普通python相比

对。但不多

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

我只是想尝试一下,但讨论中的python代码是为一个小型计算机集群编写的,我不是该集群的管理员。我在这里问这个问题是因为我在谷歌上的尝试只提供了与cython、UnladenSwallow等的比较,如果这不太可能奏效的话,我不想打扰管理员

如果您的代码受CPU限制,PyPy只能显著提高性能。PyPy是我所知道的本地运行的Python实现。如果真正的线程并行性对你来说是一个高优先级,你可以研究其中的一些,或者考虑编写C扩展。 我其实不需要pypy在C上表现得那么好;我希望使用它,因为现在解释器的开销完全盖过了我试图计算时间的计算。我只需要pypy把我带到手写C附近


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

我看到了这些基准测试,但希望看到一些将pypy与c和python进行比较的例子,因为这种最新的基准测试可以追溯到pypy的许多版本。我将继续尝试pypy;我将在这里发布至少一些比较pypy和python的基准测试;执行机器可以。这就是为什么这个问题问的是PyPy,而不是CPython。@Marcin:他问的是PyPy与C的关系,并假设在同一台“执行机器”(同一台计算机)上测试两者的执行速度,结果应该是一个相对性能指标。除非你在处理器中正确运行所有程序,否则执行机器会更多。CPython和PyPy不是一回事,它们有着不同的性能特征。要了解PyPy的性能如何与CPython完全不同,请参见bluemoon的建议。@OlofForshell您是故意迟钝吗?我并不是说不可能测量由C代码生成的特定可执行文件的性能——我是说这是唯一可能的测量,因为不存在语言性能的测量。您是否考虑过用一个小脚本来尝试它?是“等待套接字”还是“启动和停止线程”真的是应用程序CPU受限的性能瓶颈吗?如果是,您可能希望使用select()等待套接字并放弃并行尝试。您是否完成了原始代码的分析?它肯定会变慢(除非您使用比C程序中包含的库更好的库).JIT是一个很好的功能,但是访问时间仍然会受到影响,JIT可以使用更多的ram。但是我不喜欢使用垃圾收集器的网络功能。你怎么知道解释器开销占主导地位?如果你在集群上运行此程序,为什么要使用线程?如果你已经使用套接字与集群上的实例共享数据其他机器,为什么不使用套接字和多处理模块在一台机器上运行多个实例呢?这将使您绕过全局解释器锁定。我最终只是尝试了pypy,不幸的是它没有实质性地加快速度,我不得不用C重写代码。感谢您的回复