Python List vs. Array-quand utiliser?

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

Quelle est la raison ou les circonstances pour lesquelles je voudrais utiliser le module array à la place?

est-ce pour optimiser les performances et la mémoire, ou est-ce que je manque quelque chose d'évident?

293
demandé sur Corey Goldberg 2008-10-07 00:17:43

9 réponses

fondamentalement, les listes Python sont très flexibles et peuvent contenir des données complètement hétérogènes et arbitraires, et elles peuvent être ajoutées à très efficacement, dans temps constant amorti . Si vous avez besoin de rétrécir et de faire croître votre réseau temps-efficacement et sans tracas, ils sont la voie à suivre. Mais ils utilisent beaucoup plus d'espace que c tableaux .

le type array.array , d'autre part, est juste un emballage mince sur les tableaux C. Il ne peut contenir que des données homogènes, Toutes du même type, et n'utilise donc que des octets de mémoire sizeof(one object) * length . La plupart du temps, vous devriez l'utiliser lorsque vous avez besoin d'exposer un tableau C à une extension ou un appel système (par exemple, ioctl ou fctnl ).

array.array est aussi une façon raisonnable de représenter une chaîne mutable en Python 2.x ( array('B', bytes) ). Cependant, Python 3.x offre une mutable octet chaîne bytearray .

cependant, si vous voulez faire math sur un tableau homogène de données numériques, alors vous êtes beaucoup mieux à l'aide de NumPy, qui peut automatiquement vectoriser les opérations sur les tableaux complexes multidimensionnels.

pour faire court : array.array est utile quand vous avez besoin d'un tableau de C homogène de données pour des raisons autre que de faire des mathématiques .

348
répondu Dan Lenski 2018-06-05 13:03:42

Pour presque tous les cas, la liste normale est le bon choix. Le module arrays est plus comme un emballage fin sur les tableaux C, qui vous donnent une sorte de conteneurs fortement dactylographiés (voir docs ), avec accès à des types plus C-comme signé/non signé court ou double, qui ne font pas partie des types intégrés. Je dirais d'utiliser le module Tableaux seulement si vous en avez vraiment besoin, dans tous les autres cas coller avec des listes.

57
répondu André 2013-03-12 05:58:18

le module array est en quelque sorte l'une de ces choses dont vous n'avez probablement pas besoin si vous ne savez pas pourquoi vous l'utilisez (et notez que je n'essaie pas de le dire d'une manière condescendante!). La plupart du temps, le module array est utilisé pour l'interface avec le code C. Pour vous donner une réponse plus directe à votre question sur la performance:

Les tableaux

sont plus efficaces que les listes pour certaines utilisations. Si vous avez besoin d'allouer un tableau que vous SAVEZ pas changer, puis les tableaux peuvent être plus rapide et utiliser moins de mémoire. GvR a une anecdote d'optimisation dans lequel le module array sort pour être le gagnant (lire longtemps, mais en vaut la peine).

d'un autre côté, une partie de la raison pour laquelle les listes mangent plus de mémoire que les tableaux est que python va allouer quelques éléments supplémentaires quand tous les éléments alloués sont utilisés. Cela signifie que l'ajout d'articles aux listes est plus rapide. Donc, si vous prévoyez d'ajouter des éléments, une liste est le moyen de aller.

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

40
répondu Jason Baker 2015-07-25 15:26:22

ma compréhension est que les tableaux sont stockés plus efficacement (c.-à-d. sous forme de blocs contigus de mémoire vs. pointeurs vers des objets Python), mais je ne suis pas conscient d'aucun avantage de performance. En outre, avec les tableaux, vous devez stocker des primitives du même type, tandis que les listes peuvent stocker n'importe quoi.

12
répondu Ben Hoffstein 2008-10-06 20:22:50

C'est un compromis !

pour chacun:

liste

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

array (ex: num PY array)

  • tableau de valeurs uniformes
  • homogène
  • compact (en taille)
  • efficace (fonctionnalité et vitesse)
  • pratique
10
répondu KouchakYazdi 2017-03-15 10:10:28

les tableaux de bibliothèque standard sont utiles pour les entrées/sorties binaires, comme traduire une liste d'entrées en une chaîne de caractères pour écrire, disons, un fichier wave. Cela dit, Comme beaucoup l'ont déjà noté, si vous allez faire un travail réel, alors vous devriez envisager D'utiliser NumPy.

7
répondu giltay 2008-10-07 13:47:01
Le tableau

ne peut être utilisé que pour des types spécifiques, tandis que les listes peuvent être utilisées pour n'importe quel objet.

Les tableaux

ne peuvent également contenir que des données d'un type, alors qu'une liste peut contenir des entrées de divers types d'objets.

Les tableaux

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

5
répondu Hortitude 2008-10-06 20:25:05

si vous allez utiliser des tableaux, considérez les paquets numpy ou scipy, qui vous donnent des tableaux avec beaucoup plus de flexibilité.

5
répondu Alex Coventry 2008-10-06 20:30:54

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

0
répondu vivek 2018-07-17 00:46:44