首页 > 解决方案 > 有没有办法加快这些嵌套循环(拉普拉斯案例)Python?

问题描述

我正在尝试加快函数 Gram 中的嵌套循环。

我的导致大延迟的函数是拉普拉斯算子(Abel),因为它需要为矩阵的每个单元格逐行计算一列的范数。

abel = lambda x,y,t,p: np.exp(-np.abs(p) * np.linalg.norm(x-y))

def Gram(X,Y,function,t,p):
    n = X.shape[0]
    s = Y.shape[0]
    K = np.zeros((n,s))
    if function==abel:
        for i in range(n):
            for j in range(s):
                K[i,j] = abel(X[i,:],Y[j,:],t,p)
    else:
        K = polynomial(X,Y,t,p)
    return K

通过将指数部分排除在 abel 方程之外,我能够稍微加快函数的速度,然后将其应用于整个矩阵。

abel_2 = lambda x,y,t,p: np.linalg.norm(x-y)(不要介意t和p)。

def Gram_2(X,Y,function,t,p):
    n = X.shape[0]
    s = Y.shape[0]
    K = np.zeros((n,s))
    if function==abel_2:
        for i in range(n):
            for j in range(s):
                K[i,j] = abel_2(X[i,:],Y[j,:],0,0)
        K = np.exp(-abs(p)*K)
    else:
        K = polynomial(X,Y,t,p)
    return K

时间减少了 50%,但是,我相信双循环(嵌套)仍然是一个主要问题。有人可以帮忙吗?谢谢!

标签: pythonperformanceloopsnested-loops

解决方案


基本上,与其逐个循环从 中减去X[i,:],不如从所有 Y 中选择并减去它,然后在某个轴上应用范数Y[j,:],从而节省大量时间!X[i,:]

就我而言,它是axis=1

def Gram_10(X,Y,function,t,p):
    n = X.shape[0]
    s = Y.shape[0]
    K = np.zeros((n,s))
    if function==abel_2:
        for i in range(n):
# it is important to put the correct slice (:s) , so the matrix provided by the norm goes
# to the right place in the function 
                K[i,:s] = np.linalg.norm(X[i,:]-Y,axis=1)
        K = np.exp(-abs(p)*K)
    else:
        K = polynomial(X,Y,t,p)
    return K

推荐阅读