是否可以使这个矩阵运算更快?

时间:2021-01-01 19:35:28

标签: python performance tensor numba

我想计算

对于固定的 iN 和 i0,其中 G 是一个 nxn 复数数组,而 F 原则上是一个 (N+1)x(N+1)xnxn 复数数组。但是,F 具有对称性,使得 F(k,j)=F(k-j+1,1) 如果 j>=1,则 F 可以存储在形状为 (N+1)x2xnxn 的数组中。例如,典型值为 N=20 和 n=4。

目前,我将 Python 与 jit 结合使用,我对应的函数如下所示:

@jit(nopython=True)
def calc():
    out = np.complex128(0)
    i = np.empty(N+1,np.int32) # index array
    i[0] = i0
    i[N] = iN
    for j in range(n**(N-1)): # one execution of the inner of this loops corresponds to one term in the large sum
        for k in range(1,N): # this loops calculates the index array
            i[k] = j % n
            j = j // n

        F_temp = np.complex128(1)
        for kpr in range(N+1):
            F_temp = F_temp * F[kpr,0,i[kpr],i[0]]
            for kprpr in range(1,kpr+1):
                F_temp = F_temp * F[kpr-kprpr+1,1,i[kpr],i[kprpr]]

        G_temp = np.complex128(1)
        for k in range(N):
            G_temp = G_temp * G[i[k+1],i[k]]

        out += G_temp * F_temp
    return out

我觉得这个实现远非最佳(可能是一个数量级)。例如,如果我使用 np.complex64 而不是 np.complex128,我根本看不到加速(对于有效的实现来说,这不应该是这种情况,对吧?)。 所以,问题是:我有没有可能在这个(或者至少在那个球场上)达到 10 倍的加速?就像用另一种语言实现这个函数并从 python 中调用它一样(甚至一定会比 numba 更快)?

0 个答案:

没有答案