Quiero tener un objeto Cython "cdef" con un miembro NumPy, y ser capaz de utilizar el acceso rápido al búfer. Idealmente, me gustaría hacer algo como:Declaraciones de búfer de Cython para miembros de objeto
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)
Desafortunadamente, Cython no puede compilar este, con el error Buffer types only allowed as function local variables
.
La solución que estoy usando es declarar el buffer de atributos en una nueva variable local, asignado al miembro de objeto:
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
Esto se vuelve muy molesto si usted quiere tener múltiples métodos de acceso a los mismos datos estructuras - que parece un caso de uso bastante común, ¿no?
¿Existe alguna solución mejor que no requiera volver a declarar los tipos dentro de cada método?
actualizados enlace http://www.mail-archive.com/[email protected]/msg05166.html – gg349
¿Esto puede perder rendimiento? – machen