La complexité du produit classique est grande en O(n3). L'algorithme de Strassen, en économisant une
multiplication coûteuse, permet de réduire cette complexité à O(n2,8) au prix d'un plus grand nombre
d'opérations d'additions. La différence ne doit apparaitre que sur de grandes matrices.
Le temps d'exécution a été obtenu avec le module python timeit et la commande suivante dans une
console :
pour la méthode classique
pour la méthode de Strassen
pour la fonction intégrée de numpy (dot)
Remarque : Les tests ont été fait sur un ordinateur équipé d'un Athlon XP à 1,3 GHz.
classique Strassen dot (numpy)
matrice 4x4 758 usec 2,89 msec 349 usec
matrice 8x8 3,27 msec 19 msec 362 usec
matrice 16x16 22 msec 131 msec 415 usec
matrice 32x32 176 msec 880 msec 622 usec
matrice 64x64 1,43 sec 6,13 sec 1,9 msec
matrice 512x512 2,38 sec
Contrairement à ce qui avait
été imaginé, l'algorithme de
Strassen ne prend pas le
dessus sur la méthode
classique.
Plusieurs explications sont
possibles :
La récursivité rend
l'algorithme de Strassen
moins performant par rapport
à celui de la méthode
classique.
L'implémentation dans
un langage interprété comme
python ralentit les 2
algorithmes et repousse le
moment où l'algorithme de
Strassen prend l'avantage.
On remarque que la fonction interne de numpy est clairement plus performante, elle est
probablement compilée. Une version en C de l'algorithme de Strassen a été implementée pour tester
avec des matrices plus grandes mais le résultat était le même.