【问题标题】:Making a np.einsum faster when inputs are many identical arrays? (Or any other faster method)当输入是许多相同的数组时使 np.einsum 更快? (或任何其他更快的方法)
【发布时间】:2020-07-09 03:59:43
【问题描述】:

我有一段代码类型:

nnt = np.real(np.einsum('xa,xb,yc,yd,abcde->exy',evec,evec,evec,evec,quartic))

evec 是(比如说)一个 L x L np.float32 数组,quartic 是一个 L x L x L x L x T np.complex64 数组。

我发现这个程序比较慢。

我认为既然所有evec 都是相同的,那么可能有更快的方法来做到这一点?

提前致谢。

【问题讨论】:

    标签: python numpy numpy-einsum


    【解决方案1】:

    首先你可以重用第一个计算:

    evec2 = np.real(np.einsum('xa,xb->xab',evec,evec))
    nnt = np.real(np.einsum('xab,ycd,abcde->exy',evec2,evec2,quartic))
    

    如果你不关心内存,只需要性能:

    evec2 = np.real(np.einsum('xa,xb->xab',evec,evec))
    nnt = np.real(np.einsum('xab,ycd,abcde->exy',evec2,evec2,quartic,optimize=True))
    

    【讨论】:

    • 好主意。要获得最大性能,请认为您可以跳过 optimize 以获得 evec2,因为那里没有减少总和。
    • @Divakar,这是真的。谢谢你的观点。我编辑帖子。
    • 哇!它燃烧得很快。它从 16 秒变为 0.007 秒。从现在开始,我将确保尝试重用计算。谢谢!
    猜你喜欢
    • 2020-11-04
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多