2017-08-21 1 views
0

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?

Répondre

0

Je ne pense pas qu'il y ait une solution pour passer de memoryview ou même numpy à std::vector sans utiliser le GIL. La seule solution que j'ai trouvé était de convertir d'abord le grand tableau en un vector[vector[pair[double,double]]] et ensuite vous pouvez y accéder sans le GIL dans une seconde boucle où vous faites tous les calculs intensifs.