我有以下代码,我正在努力加快:
for alpha in range(-N,N+1):
for beta in range(-N,N+1):
I1 = (alpha+N)+(beta+N)*(2*N+1)
for gamma in range(-N,N+1):
for delta in range(-N,N+1):
if alpha!=gamma or beta!=delta:
J1 = (gamma+N)+(delta+N)*(2*N+1)
temp1 = 0;
for nn in range(0,numphases-1):
R = pi*(sqrt((a[nn+1]*(alpha-gamma)/a[0])**2+((b[nn+1]*(beta-delta)/b[0])**2)))
temp1 += (f[nn+1,mm]-f[nn,mm])*(pi/2)*((a[nn+1]*b[nn+1]))*(fp.besselj(1,R[0,0]))/R[0,0]
Lambda[I1,J1,mm] = temp1[0,0]
对于N等于>的值。 1。
我看过许多并行化并将其矢量化的例子,但我仍然不确定我能做些什么来加快它。
非常感谢任何帮助!
答案 0 :(得分:0)
接近这种循环的一种方法是使用numpy和多维数组并尝试向量化计算。每个循环对应于numpy数组的另一个维度。你可以从最里面的循环开始,你可以这样写:
Lambda[I1,J1,mm] = sum(f[1:,mm]-[f[0:-1,mm]*pi/2+a[1:]*b[1:]*fp.besselj(1,R)/R
然后你会向外移动另一个维度。但这非常诡计,可能并不总是有效。在这种情况下,例如我无法弄清楚如何将R两者都塞进贝塞尔函数并进入提名者。
更简单的方法就是重写计算,至少是C或C ++中的内部循环本地或通过各种绑定库,然后只需从Python调用例程。