Bonjour,
J'ai un algorithme de calcule basé sur une fonction de combinaison probabiliste. J'ai effectué un line by line profiling et je sais désormais, d'où vient la lenteur. Ma première fonction est nCr, qui prend deux entiers n et r pour renvoyer la combinaison (nombre entier).
La deuxième fonction se base sur des combinaisons en vecteur. En effet, le code d'origine est en loop for, ça donne ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 from itertools import izip def nCr(self,n,r): if n > r: return reduce(lambda x, y: x * y[0] / y[1], izip(xrange(n - r + 1, n+1), xrange(1, r+1)), 1) elif n == r: return 1 else: return 0
Pour améliorer ceci, je définis un numpy array qui a le range de k, j'applique la fonction nCr en vecteur, qui j'applique la somme par einsum. Ainsi le code devient ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 z_triangle = 3*x1*np.array( [ nCr(L1,1) , nCr(L2, 1) ] ) for k in range(1,triangle_number_max): z_triangle += x1*np.array( [ nCr(L1, k+1), nCr(L2, k+1) ] )/2**k
Toutefois, ce dernier code prend beaucoup de temps aussi (un tout petit peu moins que le précédent). J'ai d'énormes simulations, et diviser le temps de cette opération par deux ou trois m'aiderai énormément.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 z_triangle = 3*x1*np.array([self.nCr(L1, 1), self.nCr(L2, 1)]) l = np.arange(1,triangle_number_max) z_triangle = z_triangle+ x1*np.einsum( 'ij->i',np.array( [ np.vectorize(nCr) (L1,l+1) , np.vectorize(nCr) (L2,l+1) ] ) / 2**l )
Merci d'avance.
Partager