web-dev-qa-db-fra.com

Qu'est ce que la vectorisation?

Qu'est-ce que cela signifie de vectoriser des boucles for Python? Existe-t-il un autre moyen d'écrire des boucles for imbriquées?

Je suis nouveau sur Python et sur mes recherches, je tombe toujours sur la bibliothèque NumPy.

13
JP Nollav

Les boucles Python for sont intrinsèquement plus lentes que leurs homologues C.

C'est pourquoi numpy propose des actions vectorisées sur les tableaux numpy. Il enfonce la boucle for que vous feriez habituellement dans Python jusqu'au niveau C, ce qui est beaucoup plus rapide. numpy offre vectorisée ("niveau C for loop ") des alternatives aux choses qui autrement devraient être faites de manière élémentaire (" niveau Python for loop).

import numpy as np
from timeit import Timer

li = list(range(500000))
nump_arr = np.array(li)

def python_for():
    return [num + 1 for num in li]

def numpy_add():
    return nump_arr + 1

print(min(Timer(python_for).repeat(10, 10)))
print(min(Timer(numpy_add).repeat(10, 10)))

#  0.725692612368003
#  0.010465986942008954

L'addition vectorielle numpy a été multipliée par 70.

20
DeepSpace

Voici une définition de Wes McKinney:

Les tableaux sont importants car ils vous permettent d'exprimer des opérations de traitement par lots sur des données sans écrire de boucles for. Ceci est généralement appelé vectorisation. Toute opération arithmétique entre des tableaux de taille égale applique l'opération élément par élément.

Version vectorisée:

>>> import numpy as np
>>> arr = np.array([[1., 2., 3.], [4., 5., 6.]])
>>> arr * arr
array([[  1.,   4.,   9.],
       [ 16.,  25.,  36.]])

La même chose avec les boucles sur une liste native Python (imbriquée)):

>>> arr = arr.tolist()
>>> res = [[0., 0., 0.], [0., 0., 0.]]
>>> for idx1, row in enumerate(arr):
        for idx2, val2 in enumerate(row):
            res[idx1][idx2] = val2 * val2
>>> res
[[1.0, 4.0, 9.0], [16.0, 25.0, 36.0]]

Comment ces deux opérations se comparent-elles? La version NumPy prend 436 ns; la version de Python prend 3,52 µs (3520 ns)). Cette grande différence entre les "petites" périodes s'appelle microperformance. Elle devient importante lorsque vous travaillez avec des données plus volumineuses ou répétez des milliers ou des millions d'opérations. de fois.

10
Brad Solomon