Exercice 60 / 100

NumPy — Vectorisation

Remplace les boucles par des opérations vectorisées

La vectorisation = remplacer une boucle Python par une opération NumPy globale. Beaucoup plus rapide (souvent 10× à 100×).

Mauvaise pratique (boucle Python)

data = np.random.randn(1000) result = [] for x in data: result.append((x - data.mean()) / data.std())

Lent car

- boucle Python interprétée - data.mean() recalculé à chaque tour - création d'une liste

Bonne pratique (vectorisée)

data = np.random.randn(1000) normalized = (data - np.mean(data)) / np.std(data)

Une ligne. Mean/std calculés une fois. Opération sur tout l'array d'un coup.

Fonctions universelles (ufuncs)

Applique une fonction à tous les éléments en code natif :

x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) # 100 sinus en une fois np.exp(data) np.log(data + 1) np.sqrt(data ** 2)

Évite à tout prix : [np.sin(v) for v in x]

Produit scalaire

Somme des produits terme à terme :

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) np.dot(a, b) → 1*4 + 2*5 + 3*6 = 32 a @ b → équivalent (a * b).sum() → équivalent (mais np.dot est plus rapide)

Pourquoi c'est rapide ?

- boucle Python : ~ 100M ops/s - NumPy vectorisé : ~ 10G ops/s (boucle C interne) - en plus, exploite SIMD du CPU
Ce qui se passe sous une ligne vectorisée : la ligne écrite en Python déclenche une boucle en C, qui traite elle-même plusieurs valeurs par cycle du processeur

Règle d'or : si tu écris un for sur un array NumPy, demande-toi systématiquement "y a-t-il une fonction vectorisée pour ça ?". Souvent oui : np.sum, np.mean, np.where, comparaisons, opérateurs arithmétiques.

exercise.py

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →