加速numpy的小功能

Sad*_*kov 2 python optimization performance numpy 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;
        data[i] = np.cos((np.pi*arg)/wid);
    return 0.54 + 0.46*data
Run Code Online (Sandbox Code Playgroud)

off*_*fel 5

这是矢量化的一种简单方法。使用 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
Run Code Online (Sandbox Code Playgroud)

效率稍高,但可能不太直观

i = np.arange(1, n+1)
arg = i - mid
Run Code Online (Sandbox Code Playgroud)

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

  • 这就是 numpy 的全部意义。任何算术总是在整个数组上执行。这就是为什么当“i”是数组时“i+1”起作用。如果它是一个列表,那就不会了。 (2认同)