Ускорение numpy небольшая функция - PullRequest
2 голосов
/ 15 января 2020

Эта небольшая функция вызывается в приложении несколько раз и работает очень медленно по сравнению с той же реализацией кода в 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

Ответы [ 2 ]

5 голосов
/ 15 января 2020

Это простой способ векторизации. При работе с массивами numpy хорошо то, что вы можете избежать циклов и использовать скорость numpy.

Вы можете заменить l oop следующим образом:

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

Редактировать: Скоростные результаты уже получены. Ваше l oop -версия с n = 500 занимает 3,97 se c для 10000 вычислений. Версия инструмента numpy 0.10 se c, что в 40 раз быстрее.

2 голосов
/ 15 января 2020

Numpy реализация может предложить несколько подсказок из документов .

## 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...