【发布时间】:2018-07-23 09:03:45
【问题描述】:
给定以下 3 个矩阵:
M = np.arange(35 * 37 * 59).reshape([35, 37, 59])
A = np.arange(35 * 51 * 59).reshape([35, 51, 59])
B = np.arange(37 * 51 * 51 * 59).reshape([37, 51, 51, 59])
C = np.arange(59 * 27).reshape([59, 27])
我正在使用einsum 进行计算:
D1 = np.einsum('xyf,xtf,ytpf,fr->tpr', M, A, B, C, optimize=True);
但我发现它的性能要差得多:
tmp = np.einsum('xyf,xtf->tfy', A, M, optimize=True)
tmp = np.einsum('ytpf,yft->ftp', B, tmp, optimize=True)
D2 = np.einsum('fr,ftp->tpr', C, tmp, optimize=True)
我不明白为什么。
总的来说,我正在尽可能地优化这段代码。我已经阅读了有关 np.tensordot 函数的信息,但我似乎无法弄清楚如何将它用于给定的计算。
【问题讨论】:
-
看起来已经不错了。您可以在最后一步使用 tensordot 进行一些改进,但这不是瓶颈,因此不会对时间进行太多更改。
-
但是如何将
einsum拆分为 3 会产生更好的结果?那么瓶颈是什么? -
嗯,瓶颈似乎是第二种方法(D2)的前两个步骤。
"But how come splitting einsum to 3 yields better results"- 不知道原因,但我在使用 einsum 时观察到,当使用更多输入时,einsum 会变慢,尤其是使用张量。如果我不得不猜测,我会认为它的内存拥塞,就像这里我们在 D1 方法中有 6 个循环。 -
@Divakar
optimize=True会将收缩拆分为多个较小的收缩以降低整体缩放比例。
标签: python numpy numpy-einsum