web-dev-qa-db-fra.com

Liste Python vs Array - quand utiliser?

Si vous créez un tableau 1d, vous pouvez l'implémenter en tant que liste ou bien utiliser le module 'array' de la bibliothèque standard. J'ai toujours utilisé des listes pour les tableaux 1d.

Quelle est la raison ou la situation où je voudrais utiliser le module de tableau à la place?

Est-ce pour l'optimisation des performances et de la mémoire, ou me manque-t-il une évidence?

315
Corey Goldberg

Fondamentalement, les listes Python sont très flexibles et peuvent contenir des données totalement hétérogènes, arbitraires, et peuvent être ajoutées très efficacement, dans temps constant amorti . Si vous avez besoin de réduire et d’agrandir votre liste rapidement et sans tracas, c’est le bon choix. Mais ils utilisent beaucoup plus d'espace que les tableaux C.

Le type array.array, en revanche, n’est qu’une mince enveloppe sur les tableaux C. Il ne peut contenir que des données homogènes, du même type, et utilise donc seulement sizeof(one object) * length octets de mémoire. Généralement, vous devez l’utiliser lorsque vous devez exposer un tableau C à un poste ou à un appel système (par exemple, ioctl ou fctnl). 

array.array est également un moyen raisonnable de représenter une chaîne mutable en Python 2.x (array('B', bytes)). Cependant, Python 2.6+ et 3.x offre une chaîne mutable byte sous la forme bytearray .

Cependant, si vous voulez utiliser math sur un tableau homogène de données numériques, vous ferez bien mieux d'utiliser NumPy, qui permet de vectoriser automatiquement les opérations sur des tableaux multidimensionnels complexes.

Pour faire un long récit: array.array est utile lorsque vous avez besoin d'un tableau C homogène de données pour des raisons autres que de faire math.

375
Dan Lenski

Dans presque tous les cas, la liste normale est le bon choix. Le module arrays ressemble plus à un wrapper fin que sur des tableaux C, qui vous donnent des types de conteneurs fortement typés (voir docs ), avec un accès à davantage de types de type C, tels que signé/unsigned short ou double, qui ne sont pas une partie des types intégrés. Je dirais que n'utilisez le module arrays que si vous en avez vraiment besoin. Dans tous les autres cas, respectez les listes.

59
André

Le module tableau est un peu une de ces choses dont vous n'avez probablement pas besoin si vous ne savez pas pourquoi vous l'utiliseriez (et notez que je n'essaie pas de dire cela d'une manière condescendante!) . La plupart du temps, le module tableau est utilisé pour interfacer avec le code C. Pour vous donner une réponse plus directe à votre question sur les performances:

Les tableaux sont plus efficaces que les listes pour certaines utilisations. Si vous avez besoin d'allouer un tableau que vous savez qu'il ne changera pas, les tableaux peuvent être plus rapides et utiliser moins de mémoire. GvR a une anecdote de optimisation dans laquelle le module tableau est gagnant (longue lecture, mais ça vaut la peine).

Par ailleurs, les listes consomment plus de mémoire que les tableaux en partie parce que python allouera quelques éléments supplémentaires lorsque tous les éléments attribués seront utilisés. Cela signifie que l'ajout d'éléments aux listes est plus rapide. Donc, si vous envisagez d'ajouter des éléments, une liste est la voie à suivre.

TL; DR Je n'utiliserais un tableau que si vous aviez un besoin d'optimisation exceptionnel ou si vous aviez besoin d'une interface avec le code C (et que vous ne pouvez pas utiliser pyrex ).

46
Jason Baker

C'est un compromis!

les avantages de chacun:

liste

  • flexible
  • peut être hétérogène

tableau (ex: tableau numpy)

  • tableau de valeurs uniformes
  • homogène
  • compact (en taille)
  • efficace (fonctionnalité et rapidité)
  • pratique
12
KouchakYazdi

Je crois comprendre que les tableaux sont stockés de manière plus efficace (c'est-à-dire sous forme de blocs de mémoire contigus par rapport à des pointeurs sur des objets Python), mais je ne suis conscient d'aucun avantage en termes de performances. De plus, avec les tableaux, vous devez stocker des primitives du même type, alors que les listes peuvent tout stocker.

12
Ben Hoffstein

Les baies de bibliothèques standard sont utiles pour les E/S binaires, telles que la traduction d'une liste d'entrées en une chaîne pour écrire dans un fichier wave, par exemple. Cela dit, comme beaucoup l'ont déjà noté, si vous voulez vraiment faire un travail, vous devriez envisager d'utiliser NumPy.

7
giltay

Les tableaux ne peuvent être utilisés que pour des types spécifiques, alors que les listes peuvent être utilisées pour n'importe quel objet.

Les tableaux ne peuvent également contenir que des données d'un seul type, alors qu'une liste peut avoir des entrées de différents types d'objets.

Les tableaux sont également plus efficaces pour certains calculs numériques.

5
Hortitude

Si vous allez utiliser des tableaux, considérez les paquets numpy ou scipy, qui vous donnent des tableaux beaucoup plus souples.

5
Alex Coventry

Une différence importante entre numpy array et list est que les tranches de tableau sont des vues du tableau d'origine. Cela signifie que les données ne sont pas copiées et que toute modification apportée à la vue sera reflétée dans le tableau source.

0
vivek