在C ++和Python程序之间共享数据的最快方法?

时间:2018-10-08 10:17:41

标签: python c++ c++11

我正在尝试构建算法交易程序。该程序具有如下执行流程:

    .featured-price{
       height:60px;
      /* -webkit-clip-path: polygon(0 80%, 100% 80%, 100% 100%, 0% 100%);
       clip-path: polygon(0 80%, 100% 80%, 100% 100%, 0% 100%); remove this clip-path*/
    }

之所以没有在C ++中构建整个组件,是因为Broker的API仅支持Python,并且如果我切换到Python,则无法执行我希望执行得足够快的操作。

数据的频率将至少每秒〜50kb(二进制和Json)。到目前为止,我发现了以下替代方法:

  1. 以C ++代码嵌入Python。 这似乎很棒,但是我不确定是否能够导入整个库并在C ++中使用类/方法(经纪人的客户端)。

  2. 通过发送数据包进行通信(此处是延迟)

  3. 将收到的数据放入SQL数据库,并让C ++每X ms查询一次。 (再次,延迟)

还有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

如果您使用的是CPython(最常见的python实现),则可以创建一个可用作python模块的动态库。那里 Boost.Python

可以用作:

#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

要使用python 3.7和boost 1.68.0进行构建,可以使用以下CMake文件

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")

答案 1 :(得分:2)

在python和C ++之间交换数据的一种方法是使用消息队列库。被设计为快速的一种可能的库是ØMQ (zeroMQ)。这是最快的方法吗?这取决于您的用例。可能值得评估。尤其要考虑易于实现的部分,良好的文档和社区支持。

答案 2 :(得分:0)

您可以将C ++代码实现为共享库(so或dll)。 您的界面应为extern "C"。 然后,您可以直接在python中调用本机函数,并通过指针在同一进程和内存中传递数据。 要调用本机函数,可以使用Python CTypes