我有一些嵌套循环(总共三个),我试图使用 numpy.einsum 来加速计算,但我正在努力使符号正确。我设法摆脱了一个循环,但我无法弄清楚另外两个。这是我到目前为止所得到的:
import numpy as np
import time
def myfunc(r, q, f):
nr = r.shape[0]
nq = q.shape[0]
y = np.zeros(nq)
for ri in range(nr):
for qi in range(nq):
y[qi] += np.einsum('i,i',f[ri,qi]*f[:,qi],np.sinc(q[qi]*r[ri,:]/np.pi))
return y
r = np.random.random(size=(1000,1000))
q = np.linspace(0,1,1001)
f = np.random.random(size=(r.shape[0],q.shape[0]))
start = time.time()
y = myfunc(r, q, f)
end = time.time()
print(end-start)
Run Code Online (Sandbox Code Playgroud)
虽然这比原来快得多,但这仍然太慢,大约需要 30 秒。请注意,没有 einsum 调用的原始内容如下(看起来需要大约 2.5 小时,迫不及待地想确定):
def myfunc(r, q, f):
nr = r.shape[0]
nq = q.shape[0]
y = np.zeros(nq)
for ri in range(nr): …
Run Code Online (Sandbox Code Playgroud)