J'effectue une opération assez complexe sur un tenseur à 3 et 4 dimensions en utilisant numpy einsum.
Mon code actuel est le suivant
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)
Il fait ce que je veux qu'il fasse.
En utilisant einsum_path, le résultat est le suivant :
>>> path = np.einsum_path('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)
>>> print(path[0])
['einsum_path', (0, 1), (0, 3), (0, 1), (0, 1)]
>>> print(path[1])
Complete contraction: oij,imj,mjkn,lnk,plk->op
Naive scaling: 8
Optimized scaling: 5
Naive FLOP count: 2.668e+07
Optimized FLOP count: 1.340e+05
Theoretical speedup: 199.136
Largest intermediate: 7.700e+02 elements
--------------------------------------------------------------------------
scaling current remaining
--------------------------------------------------------------------------
4 imj,oij->moj mjkn,lnk,plk,moj->op
5 moj,mjkn->nok lnk,plk,nok->op
4 plk,lnk->npk nok,npk->op
4 npk,nok->op op->op
Cela indique une accélération théorique d'environ 200x.
Comment puis-je utiliser ce résultat pour accélérer mon code ? Comment puis-je "mettre en oeuvre" ce que einsum_path me dit ?