在Python中为numpy数组优化嵌套for循环

时间:2018-02-07 13:21:41

标签: python numpy optimization

我正在尝试在python中优化嵌套的for循环。这是代码(注意:输入数据不需要优化):

Y=numpy.zeros(44100)
for i in range(len(Y)):
    Y[i]=numpy.sin(i/len(Y))
                              ### /Data^^
Z=numpy.zeros(len(Y))
for i in range(len(Y))
    for j in range(len(Y))
        Z[i]+=Y[j]*numpy.sinc(i-j)

如果涉及嵌套for循环,如何最好地优化为numpy数组编写的代码?

编辑:为清楚起见。

1 个答案:

答案 0 :(得分:2)

我想如果你将参数乘以某个因子f,那么这只是有意义的。但是你可以使用numpy.convolve

def orig(Y, f):
    Z=numpy.zeros(len(Y))
    for i in range(len(Y)):
        for j in range(len(Y)):
            Z[i]+=Y[j]*numpy.sinc((i-j)*f)
    return Z

def new(Y, f):
    sinc = np.sinc(np.arange(1-len(Y), len(Y)) * f)
    return np.convolve(Y, sinc, 'valid')

In [111]: Y=numpy.zeros(441)
     ...: for i in range(len(Y)):
     ...:     Y[i]=numpy.sin(i/len(Y))

In [112]: %time Z = orig(Y, 0.9)
Wall time: 2.81 s

In [113]: %timeit Z = new1(Y, 0.9)
The slowest run took 5.56 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 109 µs per loop

对于真正好的速度,请查看scipy.signal.fftconvolve