Название может быть запутанным. Здесь я изложу свой вопрос более четко.
Я хочу создать веб-сайт на основе Python (много существующих фреймворков, таких как Flask и cherryPy) и наряду с C ++ вычислительным движком для скорости обработки. Поэтому мне нужно создать интерфейс для Python для вызова функций C ++. К счастью, Boost.python может сделать эту работу. Однако каждый раз, когда я отправляю данные из python, скажем, матрицы, в C ++, я должен использовать список python, что означает, что мне нужно преобразовать данные матрицы в список и в контексте C ++ преобразовать список во внутренний объект матрицы. В результате происходит много копирования данных, что не может быть разумным или эффективным подходом. Поэтому мои вопросы таковы: если, учитывая сложность, мы не отображаем класс матрицы C ++ на класс python через boost.python, есть ли лучший способ выполнить подобную работу без или только с небольшим количеством копий?
Однако каждый раз, когда я отправляю данные из 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);
// ....
}
Есть проект под названием ndarray с его точной целью: https://github.com/ndarray/ndarray смотрите также https://github.com/ndarray/Boost.NumPy .
Существует некоторая совместимость с другими матричными библиотеками C ++ (например, Eigen), которые должны помочь в вычислениях.