【问题标题】:Is there a good way to send data from python context to C++ without too much copy involved有没有一种好方法可以将数据从 python 上下文发送到 C++ 而不涉及太多复制
【发布时间】:2016-08-10 21:13:35
【问题描述】:

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

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

【问题讨论】:

  • 如果您想使用矩阵,可以尝试直接使用 numpy。速度很快。
  • numpy 很好,但对于大数据问题,我认为 C++ 更快。这就是为什么我想使用 C++ 实现的函数作为计算引擎

标签: python c++ boost-python web-site-project


【解决方案1】:

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

不,您不必使用 python 列表。您可以使用 numpy 数组将数据分配为 C 连续段,该段可以在不复制的情况下传递给 C++,并使用矩阵包装类将其视为矩阵。

在 python 中使用 numpy 分配二维数组:

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

使用以下暴露给 python 的函数将矩阵数据传递给 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);
    // ....
}

【讨论】:

  • 我知道这是一个老问题,但你能解释一下手动减少 pobj 引用计数的原因吗?
【解决方案2】:

有一个名为 ndarray 的项目,他们的确切目标是:https://github.com/ndarray/ndarray 另见https://github.com/ndarray/Boost.NumPy

与其他 C++ 矩阵库(例如 Eigen)有一些兼容性,这应该有助于计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 2023-01-28
    • 2010-10-08
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多