8 votes

Quel est le moyen le plus rapide de partager des données entre un programme C++ et un programme Python ?

J'essaie de créer un programme de trading algorithmique. Le programme a un flux d'exécution comme celui-ci :

Server sends data via websocket -> Python program receives it and sends it to C++ program -> C++ program processes the data and sends some data to Python code -> Python code sends packets to Server

La raison pour laquelle je ne construis pas l'ensemble en C++ est que l'API de Broker ne prend en charge que Python et que je ne peux pas effectuer les opérations que je souhaite réaliser assez rapidement si je passe à Python.

La fréquence des données sera d'au moins ~50kb (binaire et Json) par seconde. Jusqu'à présent, j'ai trouvé les alternatives suivantes :

  1. Intégrer Python dans le code C++. Cela semble très bien, mais je ne suis pas sûr de pouvoir importer toute la bibliothèque et d'utiliser les classes/méthodes (client du courtier) en C++.

  2. Communiquer en envoyant des paquets (la latence est le problème ici).

  3. Placer les données reçues dans une base de données SQL et demander à C++ de l'interroger toutes les X ms. (encore une fois, latence)

Existe-t-il une meilleure façon de procéder ?

7voto

teivaz Points 147

Si vous utilisez CPython (l'implémentation la plus courante de Python), vous pouvez créer une bibliothèque dynamique qui peut être utilisée comme un module Python. Dans ce cas, vous pouvez créer une bibliothèque dynamique qui peut être utilisée comme un module python. Boost.Python

Qui peut être utilisé comme :

#include <boost/python.hpp>
char const* greet()
{
   return "hello, world";
}

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

> import hello_ext   
> print(hello_ext.greet())
hello, world

Pour construire avec python 3.7 et boost 1.68.0, vous pouvez utiliser le fichier CMake suivant

cmake_minimum_required(VERSION 3.9.0 FATAL_ERROR)

project("boost_python_sample" LANGUAGES CXX)

set(BOOST_ROOT "C:/local/boost_1_68_0")
find_package(Boost REQUIRED COMPONENTS python37)
set(Python3_ROOT_DIR "C:/python37")
find_package(Python3 REQUIRED COMPONENTS Development)

add_library("boost_python_sample" SHARED "main.cpp")
target_link_libraries("boost_python_sample" Boost::python37 Python3::Python)
target_compile_definitions("boost_python_sample" PUBLIC "BOOST_PYTHON_STATIC_LIB")

3voto

David Points 773

Vous pouvez implémenter votre code C++ sous forme de bibliothèque partagée (so ou dll). Votre interface doit être extern "C" . Vous pouvez alors appeler vos fonctions natives directement en Python et transmettre vos données via des pointeurs au sein du même processus et de la même mémoire. Pour appeler les fonctions natives, vous pouvez utiliser Python CTypes .

2voto

rbf Points 440

Une façon d'échanger des données entre Python et C++ est d'utiliser une bibliothèque de file d'attente de messages. Une bibliothèque possible, conçue pour être rapide, est ØMQ (zeroMQ) . Est-ce le moyen le plus rapide ? Cela dépend de votre cas d'utilisation. Cela peut valoir la peine d'être évalué. Surtout si l'on considère la facilité de mise en œuvre, la bonne documentation et le soutien de la communauté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X