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?
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 .
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.
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 tableauxsont 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 ).
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.
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
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.
ne peut être utilisé que pour des types spécifiques, tandis que les listes peuvent être utilisées pour n'importe quel objet.
Les tableauxne 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 tableauxsont également plus efficaces pour certains calculs numériques.
si vous allez utiliser des tableaux, considérez les paquets numpy ou scipy, qui vous donnent des tableaux avec beaucoup plus de flexibilité.
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.