关于如何使用大型for循环优化内部函数的提示

时间:2017-03-06 18:13:34

标签: python numpy optimization signal-processing

def testing(min_quadReq, stepsize, max_quadReq, S):
    y = np.arange(min_quadReq, max_quadReq, stepsize)
    print("Y", y)
    I_avg = np.zeros(len(y))
    Q_avg = np.zeros(len(y))
    x = np.arange(0, (len(S)))
    debugger = 0
    for i in range(0, len(y)):
        I = np.array(S * (np.cos(2 * np.pi * y[i] * x)))
        Q = np.array(S * (np.sin(2 * np.pi * y[i] * x)))
        I_avg[i] = np.sum(I, 0)
        Q_avg[i] = np.sum(Q, 0)
        debugger += 1
    D = [I_avg**2 + Q_avg**2]
    maxIndex = np.argmax(D)
    #maxValue = D.max()
    # in python is arctan2(b,a) compared to matlab's atan2(a,b)
    phaseOut = np.arctan2(Q_avg[maxIndex], I_avg[maxIndex])
    # returns the out value and the phase
    out = min_quadReq + ((maxIndex + 1) - 1) * stepsize
    return out, phaseOut

我正在开发一个项目,使用DSP处理信号,得出相关数据。上面的代码来自正交调制的内部功能。从我所看到的,这是最有可能被优化的代码的一部分。例如,两个和函数每个被调用大约92k次,正交函数本身被调用2696次。我对python并不熟悉所以如果有任何建议如何更有效地编写它或一些好的文档它会很可爱。

信号S是输入源,它是[481] [251]的数组。 quadReq(cavSig[j, :])只需要一些额外的信息来调用正交的外壳,以显示它的调用方式和次数。

def randomnumber():
    s = np.random.random_sample((1, 251))
    print(s)
    return s

randomnumber()

编辑:添加了更多信息

1 个答案:

答案 0 :(得分:0)

您的循环为I_avg的每个元素生成一个y值。为了紧凑,我可以把它写成列表理解。

In [61]: x=np.arange(4)
In [62]: y=np.arange(0,1,.2)
In [63]: [np.cos(2*np.pi*y[i]*x).sum() for i in range(y.shape[0])]
Out[63]: 
[4.0,
 -0.30901699437494745,
 0.80901699437494767,
 0.80901699437494834,
 -0.30901699437494756]

y[i]*x部分只是yx的外部产品,可以用np.outter编写,或者与广播一样容易{{1 }}

y[:,None]*x

继续进行交互式Python会话,并使用这样的表达式。学习的最佳方式是通过实现并立即看到结果。保持测试表达式和数组很小,以便您可以立即看到正在发生的事情。