2017-08-21 1 views
2

Je veux libérer le GIL l'intérieur d'une boucle sur un tableau numpy 3 dimensionsCython avec numpy comment se débarrasser de l'indexation de fantaisie (pas d'appel à Python)

cdef np.ndarray[DTYPE_t,ndim=3] array=np.ones((10000000,4,2)) 
cdef np.ndarray[DTYPE_t,ndim=2] sliced_array 
cdef int i 
cdef int N=array.shape[0] 
for i in range(N): 
    sliced_array=array[i] 
    #perform computations on slice 

Quand je regarde le code html produit par Cython on dirait qu'il appelle Python quand il le fait sliced_array=array[i] Je suppose que c'est parce qu'il déduit la taille des deux autres dimensions mais même en utilisant des plages typées pour les deuxième et troisième axes, cette ligne est toujours jaune!

sliced_array=array[i,typed_slice_x,typed_slice_y] 
+0

Je n'ai pas travaillé avec Cython, mais 'slice' est un builtin Python, cela peut causer le problème. –

+0

Que voulez-vous dire? – jean

+0

Essayez de renommer la variable. –

Répondre

4

L'un des avantages de la nouvelle syntaxe memoryview sur la déclaration des choses comme des tableaux numpy est que vous pouvez effectuer des opérations d'indexation sans GIL:

cdef double[:,:,:] array=np.ones((10000000,4,2)) 
cdef double[:,:] sliced_array 
cdef int i 
cdef int N=array.shape[0] 
for i in range(N): 
    with nogil: # just to prove the point 
    sliced_array=array[i,:,:] 

Si vous les déclarer comme cdef np.ndarray alors vous pouvez » t éviter facilement d'avoir besoin du GIL pour l'indexation.

+0

Ok encore merci @DavidW J'ai besoin d'acheter un livre sur Python il semble que j'ai vraiment besoin d'en apprendre plus sur la façon dont Python travaille en interne pour ne pas être coincé chaque putain de temps. – jean