Soy un novato con Cython y C ++, así que tengo una pregunta sobre la transmisión de argumentos. Quiero evitar pasar una copia de un argumento en el siguiente escenario:
# somefile.pyx #distutils: language = c++ from libcpp.vector cimport vector def add_one(vector[int] vect): cdef int i n = vect.size() for i in range(n): vect[i] += 1 cdef vector[int] v for i in range(100000): v.push_back(i) add_one(v) # <-- ??
Quiero que el método add_one
solo modifique v
“in-place”. Creo que en C ++, puede lograr esto si está pendiente de antemano el argumento con &
, lo que significa que cualquier cambio en el puntero se transfiere a pointee. De esa manera, no tiene que preocuparse por pasar un puntero o el objeto real, es decir,
add_one(v); # in c++
¿Puedo hacer lo mismo en Cython, o tengo que cambiar explícitamente el tipo arg a una referencia, es decir, def add_one(vector[int]* vect)
?
Encontré la respuesta a mi propia pregunta. Aparentemente, puede pasar por referencia, pero la función DEBE estar cdef
, no cdef
. es decir
# somefile.pyx #distutils: language = c++ from libcpp.vector cimport vector cdef void add_one(vector[int]& vect): cdef int i n = vect.size() for i in range(n): vect[i] += 1 cdef vector[int] v for i in range(100000): v.push_back(i) add_one(v)