Python 加速numpy小函数

Python 加速numpy小函数,python,performance,numpy,optimization,scipy,Python,Performance,Numpy,Optimization,Scipy,这个小函数在应用程序中被多次调用,与Matlab中的相同代码实现相比,运行速度非常慢。在那里,它的工作速度可能要快10-100倍,所以我想知道在python/numpy中它在哪里可以改进 def ahamming(n,mid): data = np.zeros(n) wid1 = mid - 1 wid2 = n - mid wid = max(wid1,wid2) for i in range(n): arg = (i+1) - mid

这个小函数在应用程序中被多次调用,与Matlab中的相同代码实现相比,运行速度非常慢。在那里,它的工作速度可能要快10-100倍,所以我想知道在python/numpy中它在哪里可以改进

def ahamming(n,mid):
    data = np.zeros(n)
    wid1 = mid - 1
    wid2 = n - mid
    wid = max(wid1,wid2)

    for i in range(n):
        arg = (i+1) - mid;
        data[i] = np.cos((np.pi*arg)/wid);
    return 0.54 + 0.46*data
Numpy可以从中提供一些提示

##参考上面链接的numpy实现
戴夫·汉明(M):
如果M<1:
返回数组([]))
如果M==1:
返回一个(1,浮动)
n=arange(0,M)
返回0.54-0.46*cos(2.0*pi*n/(M-1))#重要性

这是一个简单的矢量化方法。使用numpy阵列的好处是可以避免循环并利用numpy的速度

可以按如下方式替换循环:

def ahamming(n,mid):
    data = np.zeros(n)
    wid1 = mid - 1
    wid2 = n - mid
    wid = max(wid1,wid2)

    i = np.arange(n)
    arg = (i+1) - mid
    data = 0.54 + 0.46*np.cos((np.pi*arg)/wid)

    return data
效率稍微高一点,但可能不够直观

i = np.arange(1, n+1)
arg = i - mid

编辑:速度结果在中。n=500的循环版本需要3.97秒进行10000次计算。numpy版本工具0.10秒,速度快了40倍。

谢谢,我刚刚发现np.cos函数可以在整个阵列上工作,而且速度快得多。此外,修复了缺失的部分。因为这很简单,我不确定我现在是否应该删除这个问题。这就是numpy的全部要点。始终对整个阵列执行任何算术运算。这就是为什么
i
是数组时
i+1
起作用的原因。如果它是一个列表,它就不会。