有没有一种好的方法可以将数据从python上下文发送到c++,而不涉及太多的复制?

Is there a good way to send data from python context to C++ without too much copy involved

本文关键字:c++ 复制 太多 上下文 一种 方法 数据 有没有 python      更新时间:2023-10-16

标题可能令人困惑。在这里我将更清楚地陈述我的问题。

我想创建一个基于python的网站(很多现有的框架,如Flask和cherryypy)和一个c++计算引擎,为了处理速度的缘故。所以我需要为python创建一个接口来调用c++函数。幸运的是提振。Python可以完成这项工作。然而,每次我从python发送一个数据,比如一个矩阵,到c++,我必须使用python list,这意味着我必须将矩阵数据转换为列表,在c++上下文中,将列表转换为内部矩阵对象。因此,会发生大量的数据复制,这不是一种智能或有效的方法。所以我的问题是,如果考虑到复杂性,我们不通过boost将c++矩阵类映射到python类。Python,有没有更好的方法来做类似的工作没有或只有少量的副本?

然而,每次我从python发送一个数据,比如一个矩阵,到c++,我必须使用python列表,这意味着我必须变换矩阵在c++上下文中,将list转换为内部的矩阵对象。

不,你不必使用python列表。你可以使用numpy数组,它将数据分配为C连续段,可以不复制地传递到c++,并使用矩阵包装器类将其视为矩阵。

在python中使用numpy分配2d数组:

>>> y=np.empty((2,5), dtype=np.int16)
>>> y
array([[   12, 27750, 26465,  2675,     0],
       [    0,     0,     0,  2601,     0]], dtype=int16)
>>> y.flags['C_CONTIGUOUS']
True
>>> foo(y,2,5)

使用下面的函数将矩阵数据传递给c++:

void foo(python::object obj, size_t size1, size_t size2)
{
    PyObject* pobj = obj.ptr();
    Py_buffer pybuf;
    PyObject_GetBuffer(pobj, &pybuf, PyBUF_SIMPLE);
    void *buf = pybuf.buf;
    int16_t *p = (int16_t*)buf;
    Py_XDECREF(pobj);
    MyMatrixWrapper matrix(p, size1, size2);
    // ....
}

有一个叫做narray的项目就是以此为目标的:https://github.com/ndarray/ndarray参见https://github.com/ndarray/Boost.NumPy。

与其他c++矩阵库(例如。