在C++和Python之间交换数据的最快方法是什么?

4
我正在处理一个由C++和Python编写的项目。两个进程之间通过TCP sockets通信。但目前速度过慢,想了解如何最快地在C++和Python之间交换信息?
我听说过ZeroMQ,但它比普通TCP socket快得多吗?
编辑:操作系统是Linux,需要传输的数据由多个浮点数组成(假设大约有100个数字),每0.02秒传输一次,双向传输。因此,Python代码每秒会50次将100个浮点数发送到C++,然后C++代码会回复100个浮点数。

为什么不使用UDP?还是共享内存? - masoud
3
管道怎么样?需要传输的数据是什么?它只是单向传输吗?您对效率有什么要求?多慢才算“太慢”? - Some programmer dude
什么操作系统?你可以尝试使用Unix域套接字。 - Galik
1
如果您每秒只传输400字节或800字节50次,这不需要特殊解决方案,即使没有任何特殊优化,您也应该能够获得这种性能水平。您获得了什么性能数字? - Dietrich Epp
1
每秒50次的800字节仅为约40KB/s或320Kb/s。任何TCP连接都应该能够处理它。 - NathanOliver
显示剩余9条评论
3个回答

2
如果性能是您关心的唯一指标,则共享内存将是在同一台机器上运行的两个进程之间共享数据的最快方法。您可以在共享内存中使用信号量进行同步。 TCP套接字也能够工作,并且可能足够快。由于您正在使用Linux,我建议使用管道,这是最简单的方法,它们将优于TCP套接字。这应该让您开始:http://man7.org/linux/man-pages/man2/pipe.2.html 有关更多背景信息,我推荐UNIX环境高级编程。

1
管道比TCP具有更好的性能(或者换句话说,开销更小)。 - nada

2
如果你在同一台机器上,可以使用命名的共享内存,这是一种非常快速的选项。在Python中,你可以使用multiprocessing.shared_memory,而在C++中,你可以使用POSIX共享内存(假设你在Linux系统上)。

1
简短回答,不行,但ZeroMQ可能有其他优势。让我们直接看看,如果你在Linux上并且想要快速数据传输,你可以使用共享内存。但是这不会像使用ZeroMQ那样容易。
因为ZeroMQ是一个消息队列。它解决了(并且解决得很好)不同的问题。它能够在C++和Python之间使用IPC,对于相同的用途,这可以比使用套接字更快,并为您未来的开发提供网络功能窗口。它可靠且非常易于使用,在Python和C++中具有相同的API。它经常与Protobuf一起使用,甚至用于高吞吐量的序列化和发送数据

在ZeroMQ上进行IPC的第一个问题是它缺乏Windows支持,因为它不是一个POSIX兼容系统。但最大的问题也许不在这里: ZeroMQ很慢,因为它嵌入了你的消息。你可以享受它的好处,但它可能会影响性能。检查这一点的最好方法,总是测试自己使用IPC-BENCH,因为我不确定我在之前提供的链接中所使用的基准测试是否使用IPC。然而,与本地域TCP相比,IPC的平均增益并不太好。

正如我之前所说,我相信共享内存会是最快的解决方案,除非你选择自己在Python中开发C++封装。我敢打赌这是最快的解决方案,但如果需要多线程,则需要进行一些工程设计,因为C++和Python都将在同一个进程中运行。当然,如果已经启动了当前的C++代码,则需要进行调整。

像往常一样,请记住优化总是发生在一个上下文中。如果与处理后可以完成的处理相比,数据传输只占运行时间的一小部分,或者如果您可以等待使用共享内存将帮助您获得的0.00001秒,那么直接转向ZeroMQ可能是值得的,因为它更简单、更可扩展、更可靠。


嗨,我认为zmq_ipc很慢,因为在底层,它没有使用共享内存而是使用了透明进程间通信(TIPC)。嵌入另一个消息不应该使它显著变慢... - HCSF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接