Я хочу иметь объект "cdef" на Cython с элементом NumPy и иметь возможность использовать быстрый доступ к буферу. В идеале я бы сделал что-то вроде:
import numpy as np
cimport numpy as np
cdef class Model:
cdef np.ndarray[np.int_t, ndim=1] A
def sum(self):
cdef int i, s=0, N=len(self.A)
for 0 <= i < N:
s += self.A[i]
return s
def __init__(self):
self.A = np.arange(1000)
К сожалению, Cython не может скомпилировать это с ошибкой Buffer types only allowed as function local variables
.
Обходной путь, который я использую, заключается в объявлении атрибутов буфера для новой локальной переменной, назначенной члену объекта:
cdef class Model:
cdef np.ndarray A
def sum(self):
cdef int i, s=0, N=len(self.A)
cdef np.ndarray[np.int_t, ndim=1] A = self.A
for 0 <= i < N:
s += A[i]
return s
Это становится действительно раздражающим, если вы хотите иметь несколько методов, обращающихся к одним и тем же структурам данных - что кажется довольно распространенным случаем, не так ли?
Есть ли лучшее решение, которое не требует повторного объявления типов внутри каждого метода?