Самый быстрый способ обмена данными между C ++ и Python? - PullRequest
2 голосов
/ 30 сентября 2019

Я работаю над проектом, написанным на C ++ и Python. Связь между двумя сторонами осуществляется через сокеты TCP. Оба процесса выполняются на одном компьютере.

Проблема в том, что он слишком медленный для текущих потребностей. Какой самый быстрый способ обмена информацией между C ++ и Python?

Я слышал о ZeroMQ, но будет ли он заметно быстрее, чем обычные сокеты TCP?

Редактировать: ОС - это Linux, данные, которыедолжно быть передано состоит из нескольких поплавков (скажем, около 100 чисел) каждые 0,02 с, в обе стороны. Таким образом, 50 раз в секунду код Python отправляет 100 чисел с плавающей запятой в C ++, а затем код C ++ отвечает 100 числами с плавающей запятой.

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Короткий ответ, нет, но ZeroMQ может иметь и другие преимущества. Давайте перейдем прямо к этому, если вы работаете в Linux и хотите быструю передачу данных, вы идете Общая память . Но это будет не так просто, как с ZeroMQ.

Поскольку ZeroMQ - это очередь сообщений. Это решает (и хорошо решает) различные проблемы. Он может использовать IPC между C ++ и Python, что может быть заметно быстрее, чем использование сокетов (для тех же целей), и дает вам окно для сетевых функций в ваших будущих разработках. Это надежный и довольно простой в использовании, с тем же API в Python и C ++. Он часто используется с Protobuf для сериализации и отправки данных , даже для высокой пропускной способности.

Первая проблема с IPC в ZeroMQ заключается в том, что ему не хватает поддержки Windows, поскольку она не совместима с POSIX. Но самая большая проблема, возможно, не в этом: ZeroMQ медленный , потому что он встраивает ваше сообщение. Вы можете наслаждаться преимуществами этого, но это может помешать выступлениям. Лучший способ проверить это, как всегда, это проверить самостоятельно с помощью IPC-BENCH , так как я не уверен, что эталонный тест, который я предоставил в предыдущей ссылке, использовал IPC. Средний выигрыш с IPC по сравнению с TCP локального домена не является фантастическим.

Как я уже говорил ранее, я уверен, что Shared Memory будет самой быстрой, исключая последнюю возможность: разработайте свою собственную оболочку C ++ в Python . Могу поспорить, что это самое быстрое решение, но для многопоточности потребуется немало инженерных решений, потому что и C ++, и Python будут работать в одном и том же процессе. И, конечно, вам нужно настроить текущий код C ++, если он уже запущен.

И, как обычно, помните, что оптимизация всегда происходит в контексте. Если передача данных составляет лишь часть времени выполнения по сравнению с обработкой, которую вы можете выполнить после этого, или если вы можете подождать 0,00001 с, что поможет вам получить общую память, возможно, стоит перейти непосредственно к ZeroMQ, посколькуэто будет проще, масштабируемее и надежнее.

1 голос
/ 30 сентября 2019

Если вы находитесь на той же машине, используйте именованную общую память, это самый быстрый вариант. На python у вас есть multiprocessing.shared_memory, а в C ++ вы можете использовать posix shared memory , как только вы в Linux.

1 голос
/ 30 сентября 2019

В случае, если производительность - единственный показатель, который вас интересует, совместная память станет самым быстрым способом обмена данными между двумя процессами, работающими на одной машине. Вы можете использовать семафор в общей памяти для синхронизации.

Сокеты TCP также будут работать и, вероятно, будут достаточно быстрыми. Поскольку вы используете Linux, я бы просто использовал каналы, это самый простой подход, и они будут превосходить сокеты TCP . Это должно помочь вам начать: http://man7.org/linux/man-pages/man2/pipe.2.html

Для получения дополнительной справочной информации я рекомендую Расширенное программирование в среде UNIX .

...