<分区>
我确实看过这篇文章,但它没有回答我的问题:C/Python Socket Performance?
我的任务是创建一个可以基于套接字创建数千个连接的应用程序。我可以在 Python 中执行此操作,但我希望有性能改进的空间。由于我过去的项目,我知道这在 Python 中是可能的,但我很好奇如果我用 C(而不是 C++)来做这个项目会有多少性能改进?
<分区>
我确实看过这篇文章,但它没有回答我的问题:C/Python Socket Performance?
我的任务是创建一个可以基于套接字创建数千个连接的应用程序。我可以在 Python 中执行此操作,但我希望有性能改进的空间。由于我过去的项目,我知道这在 Python 中是可能的,但我很好奇如果我用 C(而不是 C++)来做这个项目会有多少性能改进?
最佳答案
这实际上取决于您对套接字的处理方式。
最佳通用答案是:通常 Python 足够好,这无关紧要,但有时并非如此。
创建和连接套接字所花费的时间开销是最小的,读取和写入也不会差很多。但这并不重要,无论如何,这几乎从来没有花费任何重要的时间。
适用于 Python 的 react 器和前摄器与适用于 C 的通用 react 器和前摄器一样好(并且一半的 C 库具有 Python 绑定(bind))。如果您在套接字之外没有做太多重要的工作,那么这通常是您的主要瓶颈。如果你有一个非常具体的使用模式和/或非常严格指定的硬件,你可能能够编写一个自定义的 react 器或前摄器来击败任何通用的东西。在那种情况下,您几乎必须使用 C,而不是 Python。
但通常,除了操纵套接字之外,您还有大量工作要做。
如果这项工作大部分是独立的并且高度可并行化,那么 C 显然胜过 Python(因为 GIL),除非这些工作足够繁重以至于您可以对它们进行多处理(请记住“足够繁重”可以很漂亮在 Windows 平台上很重)。当然,除了编写多线程 C 代码非常容易搞砸性能(更不用说稳定性)之外;实际上,与 C 或 Python 相比,Erlang 或 Haskell 之类的东西在这里可能是更好的选择。 (如果你要说,“但我们有一些人在 C 方面有经验,但他们不会学习 Haskell”,那么这些人可能不够优秀,无法编写多线程代码。)
如果这项工作主要是套接字缓冲区之间的内存复制,并且您可以处理一个严格指定的系统,您可以编写优化零拷贝的 C 代码,而在 Python 中没有办法做到这一点。
但是,如果它主要是典型的事情,例如在磁盘上等待或序列化计算,那么您如何编写套接字内容几乎无关紧要,因为它最终将等待真正的代码。
因此,在没有任何更多信息的情况下,我会选择 Python,因为与 C 相比,您节省的启动、运行和调试时间可以用于优化或改进任何重要的事情。
关于python - C 或 Python 用于创建套接字连接的性能和可伸缩性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521751/