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.
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.
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.