J'écris un programme plus grand et il est très important que les déterminants des matrices 3x3 soient aussi rapides que possible pour que cela fonctionne bien. J'ai lu que je pourrais utiliser numPy pour le faire, mais je pensais que peut-être écrire mon propre code serait plus instructif que je suis dans mon 3ème semestre de CompSci.3x3 Fonction déterminante de la matrice - la rendre plus rapide
J'ai donc écrit deux fonctions et j'utilise time.clock() (je suis sur une machine win7) pour calculer le temps nécessaire pour que chaque fonction renvoie une valeur.
Ceci est la première fonction:
def dete(a):
x = (a[0][0] * a[1][1] * a[2][2]) + (a[1][0] * a[2][1] * a[3][2]) + (a[2][0] * a[3][1] * a[4][2])
y = (a[0][2] * a[1][1] * a[2][0]) + (a[1][2] * a[2][1] * a[3][0]) + (a[2][2] * a[3][1] * a[4][0])
return x - y
Et ceci est la deuxième fonction:
def det(a):
a.append(a[0]); a.append(a[1]);
x = 0
for i in range(0, len(a)-2):
y=1;
for j in range(0, len(a)-2):
y *= a[i+j][j]
x += y
p = 0
for i in range(0, len(a)-2):
y=1;
z = 0;
for j in range(2, -1, -1):
y *= a[i+z][j]
z+=1
z += 1
p += y
return x - p
Ils donnent tous deux les bonnes réponses, mais le premier semble être un peu plus rapide, ce qui rend Je pense que puisque les boucles sont plus élégantes à utiliser et généralement plus rapides, je fais quelque chose de mal - j'ai fait les boucles trop lentes et trop grosses. J'ai essayé de le réduire, mais il semble que les opérations * = et + = prennent trop de temps, il y en a trop. Je n'ai pas encore vérifié à quelle vitesse numPy s'occupe de ce problème, mais je veux devenir meilleur en écrivant du code efficace. Des idées pour rendre ces boucles plus rapides?
Semble être légèrement plus rapide? Veuillez utiliser 'timeit' et un profileur pour montrer ** exactement ** combien plus vite. –
Donc, les boucles for sont généralement plus rapides qu'un simple calcul direct déroulé? Hmm ... semble que j'ai besoin d'apprendre beaucoup de choses sur Python;) –
Si vous voulez calculer un déterminant 3x3, il n'y a rien de plus élégant que cette formule optimisée de votre première fonction. –