2 votes

Accélérer la petite fonction numpy

Cette petite fonction est appelée plusieurs fois dans une application et s'exécute vraiment lentement par rapport à la même implémentation de code en Matlab. Là-bas, cela fonctionne peut-être jusqu'à 10 à 100 fois plus vite, alors je me demandais où cela pourrait être amélioré en 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

5voto

offeltoffel Points 1105

Ceci est un exemple facile pour la vectorisation. La bonne chose lorsque vous travaillez avec des tableaux numpy est que vous pouvez éviter les boucles et utiliser la vitesse de numpy.

Vous pouvez substituer la boucle comme suit :

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

Un peu plus efficace, mais peut-être moins intuitif est

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

Édition: Les résultats de vitesse sont là. Votre version avec boucle avec n = 500 prend 3.97 sec pour 10000 calculs. La version numpy a duré 0.10 sec ce qui est plus rapide de facteur 40.

2voto

zaxishere Points 106

La mise en œuvre Numpy peut offrir quelques indications dans la documentation.

## référence à l'implémentation numpy liée ci-dessus
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)) # d'importance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X