73 votes

Pourquoi les tableaux NumPy sont-ils si rapides ?

Je viens de modifier un programme que j'écris pour que mes données soient stockées dans des tableaux numpy, car j'avais des problèmes de performances, et la différence est incroyable. Le programme, qui prenait 30 minutes à l'origine, ne prend plus que 2,5 secondes !

Je me demandais comment il faisait. Je suppose que c'est parce qu'il supprime le besoin de for mais au-delà de ça, je reste sur ma faim.

113voto

larsmans Points 167484

Les tableaux Numpy sont des tableaux denses de type homogène. Les listes Python, en revanche, sont des tableaux de pointeurs vers des objets, même s'ils sont tous du même type. Ainsi, vous bénéficiez des avantages de localité de référence .

De plus, de nombreuses opérations de Numpy sont implémentées en C, ce qui évite le coût général des boucles en Python, l'indirection des pointeurs et la vérification dynamique des types par élément. Le gain de vitesse dépend des opérations que vous effectuez, mais quelques ordres de grandeur ne sont pas rares dans les programmes de calcul.

25voto

riffraff Points 1522

Les tableaux numpy sont des structures de données spécialisées. Cela signifie que vous ne bénéficiez pas seulement des avantages d'une représentation efficace en mémoire, mais également d'implémentations spécialisées efficaces.

Par exemple, si vous additionnez deux tableaux, l'addition sera effectuée avec la fonction spécialisée Opérations vectorielles du CPU au lieu d'appeler l'implémentation python de l'addition d'int dans une boucle.

6voto

VinKrish Points 340

Considérons le code suivant :

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

tic = time.time()
c = np.dot(a, b)
toc = time.time()

print("Vectorised version: " + str(1000*(toc-tic)) + "ms")

c = 0
tic = time.time()
for i in range(1000000):
    c += a[i] * b[i]
toc = time.time()

print("For loop: " + str(1000*(toc-tic)) + "ms")

Sortie :

Vectorised version: 2.011537551879883ms
For loop: 539.8685932159424ms

Ici, Numpy est beaucoup plus rapide car il tire parti du parallélisme (ce qui est le cas de Single Instruction Multiple Data (SIMD)), alors que la boucle for traditionnelle ne peut pas en tirer parti.

0voto

Simon Points 3820

Vous avez toujours des boucles for, mais elles sont faites en c. Numpy est basé sur Atlas, qui est une bibliothèque pour les opérations d'algèbre linéaire.

http://math-atlas.sourceforge.net/

Lorsqu'il est confronté à un gros calcul, il effectue des tests en utilisant plusieurs implémentations pour déterminer laquelle est la plus rapide sur notre ordinateur à ce moment-là. Avec certaines constructions de numpy, les calculs peuvent être parallélisés sur plusieurs cpus. Vous aurez donc des calculs hautement optimisés fonctionnant sur des blocs de mémoire continus.

0voto

Deep Gajjar Points 11

Les tableaux numpy sont stockés en mémoire sous la forme de blocs continus de mémoire et les listes python sont stockées sous la forme de petits blocs dispersés dans la mémoire. L'accès à la mémoire est donc facile et rapide dans un tableau numpy et l'accès à la mémoire est difficile et lent dans une liste python.

source : https://algorithmdotcpp.blogspot.com/2022/01/prove-numpy-is-faster-than-normal-list.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X