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

  • Python vs Lua для встроенного механизма обработки сценариев / обработки текста
  • пытаясь установить kivy на мой компьютер, я получаю следующие ошибки:
  • Скриншот цветовое усреднение прямоугольников
  • Как определить тип типа numpy типа float (C-API)
  • запись надежного (определение цвета и размера) обнаружения круга с помощью opencv (на основе преобразования Hough или других функций)
  • Скомпилировать интерпретатор Python статически?
  • Поиск того же цветного блока в 2D-матрице
  • SWIG-обернутый вектор векторов (C ++ to python) - как распознать внутренний вектор как прокси-объект?
  • Python - лучший язык программирования в мире.