web-dev-qa-db-fra.com

Quels sont les avantages de NumPy par rapport aux listes normales Python?

Quels sont les avantages de NumPy par rapport aux listes normales Python?

J'ai environ 100 séries de marchés financiers et je vais créer une matrice de cubes de 100x100x100 = 1 million de cellules. Je vais régresser (3 variables) chaque x avec chaque y et z, pour remplir le tableau avec des erreurs standard.

J'ai entendu dire que pour les "grandes matrices", je devrais utiliser NumPy par opposition aux listes Python, pour des raisons de performances et d'évolutivité. Le fait est que je connais Python listes et qu'elles semblent fonctionner pour moi.

Quels seront les avantages si je passe à NumPy?

Et si j'avais 1000 séries (soit 1 milliard de cellules en virgule flottante dans le cube)?

430
Thomas Browne

Les tableaux de NumPy sont plus compacts que les listes Python: une liste de listes telle que vous la décrivez, en Python, prendrait au moins 20 Mo environ, tandis qu'un tableau NumPy 3D avec des valeurs flottantes simple précision dans les cellules s'adapter à 4 MB. L'accès à la lecture et à l'écriture d'éléments est également plus rapide avec NumPy.

Peut-être ne vous souciez-vous pas beaucoup d'un million de cellules, mais vous le feriez bien pour un milliard de cellules - aucune approche ne conviendrait dans une architecture 32 bits, mais avec les versions 64 bits, NumPy s'en tirerait avec 4 Go environ , Python seul nécessiterait au moins environ 12 Go (beaucoup de pointeurs dont la taille double) - un matériel beaucoup plus coûteux!

La différence est principalement due au "caractère indirect" - une liste Python est un tableau de pointeurs sur les objets Python, au moins 4 octets par pointeur plus 16 octets, même le plus petit Python object (4 pour le type pointeur, 4 pour le nombre de références, 4 pour la valeur - et les allocateurs de mémoire arrondis à 16). Un tableau NumPy est un tableau de valeurs uniformes - les nombres à simple précision prennent 4 octets chacun, ceux à double précision, 8 octets. Moins flexible, mais vous payez beaucoup pour la flexibilité des listes standard [Python!

682
Alex Martelli

NumPy n'est pas seulement plus efficace; c'est aussi plus pratique. Vous bénéficiez gratuitement de nombreuses opérations vectorielles et matricielles, qui permettent parfois d’éviter des travaux inutiles. Et ils sont également mis en œuvre efficacement.

Par exemple, vous pouvez lire votre cube directement à partir d'un fichier dans un tableau:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

Somme le long de la deuxième dimension:

s = x.sum(axis=1)

Recherchez les cellules dépassant un seuil:

(x > 0.5).nonzero()

Supprimez toutes les tranches paires sur la troisième dimension:

x[:, :, ::2]

En outre, de nombreuses bibliothèques utiles fonctionnent avec les tableaux NumPy. Par exemple, des bibliothèques d'analyse statistique et de visualisation.

Même si vous n’avez pas de problèmes de performances, apprendre NumPy en vaut la chandelle.

221
Roberto Bonvallet

Alex a mentionné l'efficacité de la mémoire et Roberto a mentionné la commodité. Ce sont deux points positifs. Pour quelques idées supplémentaires, je mentionnerai rapidité et fonctionnalité.

Fonctionnalité: NumPy, FFT, convolutions, recherche rapide, statistiques de base, algèbre linéaire, histogrammes, etc. sont très intégrés. Et vraiment, qui peut vivre sans FFT?

Vitesse: Voici un test sur la somme sur une liste et un tableau NumPy, montrant que la somme sur le tableau NumPy est 10 fois plus rapide (dans ce test, le kilométrage peut varier).

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

qui sur mes systèmes (pendant la sauvegarde) donne:

numpy: 3.004e-05
list:  5.363e-04
107
tom10

Voici une belle réponse de la FAQ du site Web scipy.org :

Quels avantages les baies NumPy offrent-elles par rapport aux listes (imbriquées) Python?

Les listes de Python sont des conteneurs efficaces à usage général. Ils prennent en charge l’insertion, la suppression, l’ajout et la concaténation (relativement) efficaces, et la compréhension des listes de Python en facilite la construction et la manipulation. Cependant, ils ont certaines limitations: ils ne supportent pas les opérations "vectorisées" telles que l'addition et la multiplication élément par élément, et le fait qu'ils puissent contenir des objets de types différents signifie que Python doit stocker des informations de type pour chaque élément, et doit exécuter le code de répartition de type lorsqu’il opère sur chaque élément. Cela signifie également que très peu d'opérations de liste peuvent être effectuées avec des boucles C efficaces - chaque itération nécessiterait des vérifications de type et d'autres opérations de comptabilité Python API.

39
Eliezer

Notez également que les timeseries basés sur NumPy sont pris en charge dans les scikits de timeseries:

http://pytseries.sourceforge.net

Pour la régression, je suis à peu près sûr que NumPy aura des ordres de grandeur plus rapides et plus pratiques que les listes, même pour le problème 100 ^ 3.

16
David Cournapeau

Tous ont souligné presque toutes les différences majeures entre numpy array et la liste python, je vais simplement les expliquer ici:

  1. Les tableaux Numpy ont une taille fixe à la création, contrairement aux listes python (qui peuvent croître de manière dynamique). Changer la taille de ndarray créera un nouveau tableau et supprimera l'original.

  2. Les éléments d'un tableau Numpy doivent tous être du même type de données (nous pouvons aussi avoir le type hétérogène mais cela ne vous autorisera pas d'opérations mathématiques) et auront donc la même taille en mémoire.

  3. Les tableaux Numpy facilitent les opérations mathématiques et autres types d'opérations sur un grand nombre de données. En règle générale, ces opérations sont exécutées plus efficacement et avec moins de code que ce qui est possible avec les séquences construites en python

4
Parvez Khan