J'essaye de convertir tous les appels Python dans mon code Cython en C pur pour pouvoir libérer le GIL et faire la parallélisation.Cython: comment passer de la vue mémoire numpy au vecteur [paire [double, double]] sans avoir besoin du GIL?
Je travaillais avec une liste de listes-de-taille-2 initialisé à partir d'un tableau numpy 2D donc je l'ai fait quelque chose comme ça:
cdef double[:,:,:] init=np.random.uniform((10,4,2),dtype=np.float32)
cdef int i
cdef int N=init.shape[0]
for i in range(N):
a=init[i].tolist()
#I then get this list of list
#a=[[1.,1.],[1.,1.],[1.,1.]]
#f acting on list of list
f(a)
je dois libérer le GIL intérieur de la boucle, donc je besoin de supprimer tous les appels à Python. En utilisant le vecteur [paire [double, double]] au lieu de listes et de modifier f en conséquence j'ai maintenant:
cdef vector[pair[double,double]] a
cdef double[:,:,:] init=np.ones((10,4,2),dtype=np.float32_t)
cdef int i
cdef int N=init.shape[0]
for i in prange(N):
#I need to get a vector[pair[double,double]] from the numpy init[i]
#with f now cdef acting on vector[pair[double,double]]
a=np.asarray(init[i]) #actually works but it goes through Python !
f(a)
Comment init convertir [i] (donc un double [:,:] type) à un vecteur [paire [double, double]] sans passer par python?