Cython документация объясняет очень хорошо, что они позволяют, как вы можете объявить их, и как использовать их.
Однако мне все еще не ясно, каковы они на самом деле. Например, простое назначение из массива numpy, например:
my_arr = np.empty(10, np.int32)
cdef int [:] new_arr = my_arr
может ускорить доступ/назначение my_arr
.
Что это происходит за кулисами? Numpy должен уже распределять элементы в памяти смежным образом, так что же происходит с памятью? По-видимому, это не так, ведь присвоение памяти массиву numpy new_arr
должно быть эквивалентно
cdef np.ndarray[np.int32_t, ndim=1] new_arr = np.empty(10, np.int32)
с точки зрения скорости. Тем не менее, memoryviews считаются более общими, чем numpy array buffer; вы могли бы сделать простой пример, в котором добавленное "обобщение" важно/интересно?
Кроме того, если я уже выделил указатель, чтобы сделать все как можно быстрее, в чем же преимущество приведения его к типизированной памяти? (ответ на этот вопрос может совпадать с ответом на этот вопрос)
cdef int *my_arr = <int *> malloc(N * sizeof(int))
cdef int[:] new_arr = <int[:N]>my_arr