numpy : penser vectorisé
Le contrat numpy
Un ndarray = un bloc mĂ©moire contigu et typĂ© (pas une liste d'objets Python). Toute opĂ©ration s'applique Ă tout le tableau d'un coup, en C optimisĂ© (SIMD). Le changement mental : arrĂȘte de penser « pour chaque Ă©lĂ©ment », pense « sur toute la colonne ».
# â rĂ©flexe backend # â
réflexe numpy
result = [] prix_ttc = prix * 1.20
for p in prix: # ...c'est tout.
result.append(p * 1.20)
Les quatre mécanismes à maßtriser
- Opérations élément par élément :
a * 2 + bâ s'applique Ă tout le tableau ; - Broadcasting : opĂ©rer entre shapes diffĂ©rentes compatibles â
matrice (1000, 3) - moyennes (3,)soustrait les moyennes à chaque ligne, sans copie ; - Masques booléens :
latences[latences > 500]â tonWHERE; - AgrĂ©gations par axe :
data.mean(axis=0)= moyenne par colonne,axis=1= par ligne. LeGROUP BYdes tableaux.
Le piĂšge : les copies silencieuses
a[2:5] retourne une vue (pas de copie â modifier la vue modifie l'original !), mais a[mask] retourne une copie. Sur un tableau de 10 Go, la diffĂ©rence se voit dans ta RAM. RĂ©flexe : en cas de doute, np.shares_memory(a, b).
Pourquoi numpy est-il ~100Ă plus rapide qu'une boucle Python ?