Cython - очень полезный язык для обертывания C ++ для Python. В этом сообщении блога я хотел бы привести примеры различных способов вызова функций C ++ в Cython.

Сначала я приведу примеры передачи целого числа в C ++, а затем перейду к примерам передачи массива.

Здесь я даю функции C ++, которые принимают ввод по ссылке, указателю, ссылке на указатель и указателю на указатель.

Вот функции Cython, которые являются оболочкой для функций C ++, описанных выше. Обратите внимание, что я пропустил файлы заголовков и cimport строки, которые необходимы для его компиляции. Для таких базовых функций вы можете ожидать, что Cython будет иметь однозначное соответствие с C ++ (например, cdef int*).

Я только что привел примеры функций, управляющих целыми числами. Теперь я приведу пример работы с массивами. Есть два примера. Первый знает размер массива априори до перехода к функции C ++. Другой работает с функцией C ++, которая выделяет блоки памяти внутри.

Когда часть кода Python знает размер массива, стандартным методом является выделение памяти с использованием numpy.array и передача указателя данных объекта ndarray функциям C ++. Таким образом, вам не нужно беспокоиться о праве собственности на данные, которое возникает в другом примере.

В случае, когда Python-часть кода не знает размер массива перед вызовом функций C ++, массивы необходимо создавать после получения указателей от функций C ++. Существует удобная функция np.PyArray_SimpleNewFromData, которая генерирует ndarray из указателя на данные. Однако здесь есть нюанс. Поскольку интерпретатор Python не имеет представления о памяти, которая выделяется при выполнении части кода C ++, вам необходимо вручную заставить объект ndarray освободить память, выделенную в C ++. Вы можете сделать это с помощью PyArray_ENABLEFLAGS. При вызове этой функции не забудьте выполнитьnp.import_array() в начале скрипта. В противном случае скрипт выдаст ошибку.

Для полных примеров посетите https://github.com/yuyu2172/simple_cython_behaviour.