Je dois optimiser un script qui fait un usage intensif du calcul de la norme L1 des vecteurs. Comme nous le savons, la norme L1 dans ce cas est juste une somme de valeurs absolues. En chronométrant la vitesse de numpy dans cette tâche, j'ai trouvé quelque chose de bizarre : l'addition de tous les éléments du vecteur est environ 3 fois plus rapide que la prise de la valeur absolue de chaque élément du vecteur. C'est un résultat surprenant, car l'addition est assez complexe par rapport à la prise de la valeur absolue, qui nécessite seulement de mettre à zéro chaque 32ème bit d'un bloc de données (en supposant float32).
Pourquoi l'addition est-elle 3x plus rapide qu'une simple opération par bit ?
import numpy as np
a = np.random.rand(10000000)
%timeit np.sum(a)
13.9 ms ± 87.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.abs(a)
41.2 ms ± 92.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)