如何加速嵌套for循环python

时间:2014-09-02 19:35:55

标签: python

我有以下代码,我正在努力加快:

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。

我看过许多并行化并将其矢量化的例子,但我仍然不确定我能做些什么来加快它。

非常感谢任何帮助!

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调用例程。