【问题标题】:Speeding up numpy small function加速numpy小功能
【发布时间】:2020-05-02 05:00:40
【问题描述】:

这个小函数在应用程序中被多次调用,与 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

【问题讨论】:

    标签: python performance numpy optimization scipy


    【解决方案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+1i 是一个数组时起作用的原因。如果它是一个列表,它就不会。
    【解决方案2】:

    Numpy implementation 可以提供来自docs 的一些提示。

    ## reference numpy implementation linked above
    def hamming(M):
        if M < 1:
            return array([])
        if M == 1:
            return ones(1, float)
        n = arange(0, M)
        return 0.54 - 0.46*cos(2.0*pi*n/(M-1)) # of importance
    

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 2020-11-30
      • 1970-01-01
      • 2010-12-01
      • 2016-11-26
      • 1970-01-01
      相关资源
      最近更新 更多