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

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

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

2 Solutions collect form web for “Есть ли хороший способ отправить данные из контекста python на C ++ без использования слишком большой копии”

Однако каждый раз, когда я отправляю данные из 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), которые должны помочь в вычислениях.

  • Цена переключения между C ++ и Python
  • Проверьте, нет ли PyObject
  • Эквивалент GetTickCount () для Linux
  • Как получить счетчик ссылок PyObject?
  • Синтаксический анализ строки C ++ (стиль python)
  • Эквивалент Python для контейнеров типа C ++ STL / списка
  • Вызов приложения / скрипта Python из C #
  • Я хочу изучить развитие игры. На каком языке я должен пользоваться?
  • эквивалент использования #include <Numeric / arrayobject.h> в Numpy
  • Как вы расширяете python с помощью C ++?
  • Как SWIG обертывает карту <string, string> в Python?
  • Python - лучший язык программирования в мире.