我正在使用 numpy einsum 对一些 3 维和 4 维张量执行相当复杂的操作。
我的实际代码是
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)
这就是我想要它做的事情。
使用 einsum_path,结果是:
>>> 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
这表明理论上的加速约为 200 倍。
如何使用此结果来加速我的代码?我如何“实施” einsum_path 告诉我的内容?