Как преобразовать вектор C ++ в простой вектор в Cython, минимизируя при этом взаимодействие интерпретатора Python? - PullRequest
0 голосов
/ 29 августа 2018

В частности:

  • Как предоставить numpy.ndarray как тип выходных данных функции и
  • Как использовать cimport numpy вместо import numpy для создания массива без издержек Python?

Код ниже работает, если numpy.ndarray удален из строки cdef numpy.ndarray array(int start, int end):. Согласно аннотации, в нем все еще много накладных расходов на Python (исключая инициализацию range(start, end) вектора C ++).

%%cython -a
# distutils: language = c++

import numpy
from libcpp.vector cimport vector


cdef numpy.ndarray array(int start, int end):
    cdef vector[int] vect = range(start, end)
    return numpy.array(vect)

print(array(1,15))

1 Ответ

0 голосов
/ 29 августа 2018

Массивы NumPy являются объектами Python. Если вы хотите работать с ними на скомпилированном уровне, вы должны использовать memoryviews , которые поддерживаются Cython. Затем вы можете потребовать np.asarray(cython_memoryview_variable) для перехода на Python.

Поскольку ваш базовый объект является вектором C ++, его содержимое автоматически не конвертируется в массив NumPy, поэтому вы должны решить это явно (за счет копии).

...