Есть ли хороший способ отправить данные из контекста Python в C ++ без большого количества копирования

Название может быть запутанным. Здесь я изложу свой вопрос более четко.

Я хочу создать веб-сайт на основе Python (много существующих фреймворков, таких как Flask и cherryPy) и наряду с C ++ вычислительным движком для скорости обработки. Поэтому мне нужно создать интерфейс для Python для вызова функций C ++. К счастью, Boost.python может сделать эту работу. Однако каждый раз, когда я отправляю данные из python, скажем, матрицы, в C ++, я должен использовать список python, что означает, что мне нужно преобразовать данные матрицы в список и в контексте C ++ преобразовать список во внутренний объект матрицы. В результате происходит много копирования данных, что не может быть разумным или эффективным подходом. Поэтому мои вопросы таковы: если, учитывая сложность, мы не отображаем класс матрицы C ++ на класс python через boost.python, есть ли лучший способ выполнить подобную работу без или только с небольшим количеством копий?

0

Решение

Однако каждый раз, когда я отправляю данные из python, скажем, матрицы, в C ++, я
должен использовать список Python, что означает, что я должен преобразовать матрицу
данные в список и в контексте C ++ преобразовать список во внутренний
матричный объект.

Нет, вам не нужно использовать список Python. Вы можете использовать массив NumPy, который распределяет данные как непрерывный сегмент C, который может быть передан в C ++ без копирования и просмотрен как матрица с использованием класса оболочки матрицы.

В python выделите 2d массив, используя 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)

Передайте данные матрицы в C ++, используя следующую функцию, представленную на python:

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);
// ....
}
2

Другие решения

Есть проект под названием ndarray с его точной целью: https://github.com/ndarray/ndarray смотрите также https://github.com/ndarray/Boost.NumPy .

Существует некоторая совместимость с другими матричными библиотеками C ++ (например, Eigen), которые должны помочь в вычислениях.

0

По вопросам рекламы [email protected]