J'ai passé des semaines littéralement à changer mon code cython en C pur (toujours en Cython) pour gagner en vitesse et être capable de supprimer le GIL pour faire du multithreading pour gagner encore plus de vitesse.Cython convertit numpy ndarray (N, 4,2) en vecteur [vecteur [paire [double, double]]
Avec l'aide des utilisateurs de collègues que j'a finalement réussi et a gagné un facteur 10 pur C vs cython avec un certain python, puis de nouveau un facteur 3 en utilisant 4 fils (avec Prange) dans la double boucle partie de mon code.
MAIS pour entrer dans cette boucle I d'abord le convertir deux trois dimensions numpy ndarrays
de dimensions (N, 4,2) (et (K, 4,2)) à vector[vector[pair[double,double]]]
. K et N étant raisonnablement grands.
Pour ce que je fais:
cdef int N=200000 #Of this order of magnitude
cdef np.ndarray[DTYPE_t,ndim=3] numpy_array=np.random.uniform(size=(N,4,2))
t1=time.time()
cdef vector[vector[pair[double,double]]] c_structure
c_structure.reserve(N)
cdef int i
for i in range(N):
c_structure.push_back(numpy_array[i])
t2=time.time()
Pourtant, cette partie du code que je jugeais trivial est devenu le nouveau goulot d'étranglement de mon code !!! Le double pour boucle prend sur mon ordinateur 0.1s (au lieu de 1.11s dans l'implémentation d'origine) fil unique et cette partie prend 3 entières secondes (1.5s pour chaque tableau)! Ce qui rend mon code super optimisé 3 fois plus lent que mon code d'origine (1.5 * 2 + 0.1)!
Qu'est-ce que je fais de mal?! Comment accélérer cela?!
Voir another related question that I asked
Pas vraiment important dans ce contexte, mais 'np.random.uniform ((N, 4,2))' ne retourne pas un tableau 3D ... S'il vous plaît essayez de rendre le [mcve] au moins relativement correct. – MSeifert
Merci, il est maintenant corrigé – jean
Est-il possible que la plupart du temps est dans la génération de nombres aléatoires? –