web-dev-qa-db-de.com

Python-Liste vs. Array - wann verwenden?

Wenn Sie ein 1d-Array erstellen, können Sie es als Liste implementieren oder das Modul 'array' in der Standardbibliothek verwenden. Ich habe immer Listen für 1d-Arrays verwendet.

Was ist der Grund oder Umstand, warum ich stattdessen das Array-Modul verwenden möchte?

Ist es für die Performance- und Speicheroptimierung oder fehlt mir etwas offensichtliches?

315
Corey Goldberg

Grundsätzlich sind Python Listen sehr flexibel und können völlig heterogene, willkürliche Daten enthalten. Sie können in amortisierte konstante Zeit sehr effizient angehängt werden. Wenn Sie Ihre Liste zeiteffizient und problemlos verkleinern und erweitern müssen, sind Sie hier richtig. Aber sie benötigen viel mehr Platz als C-Arrays .

Der Typ array.array ist dagegen nur ein dünner Wrapper auf C-Arrays. Es kann nur homogene Daten desselben Typs speichern und verwendet daher nur sizeof(one object) * length Byte Speicher. Meistens sollten Sie es verwenden, wenn Sie ein C-Array einer Erweiterung oder einem Systemaufruf aussetzen müssen (z. B. ioctloder fctnlname__).

array.array ist auch eine sinnvolle Möglichkeit, eine veränderbare Zeichenfolge in Python 2.x (array('B', bytes) darzustellen. ). Allerdings bieten Python 2.6+ und 3.x eine veränderbare Byte-Zeichenfolge als bytearrayNAME _ .

Wenn Sie jedoch ein homogenes Array numerischer Daten berechnen möchten, sollten Sie NumPy verwenden, mit dem Operationen automatisch vektorisiert werden können komplexe mehrdimensionale Arrays.

Um es kurz zu machen : array.array ist nützlich, wenn Sie aus Gründen ein homogenes C-Array von Daten benötigen außer Mathe .

397
Dan Lenski

In fast allen Fällen ist die normale Liste die richtige Wahl. Das Arrays-Modul ähnelt eher einem dünnen Wrapper über C-Arrays, der Ihnen eine Art stark typisierter Container (siehe docs ) mit Zugriff auf weitere C-ähnliche Typen wie signierte/unsignierte Short- oder Double-Container gibt Teil der eingebauten Typen. Ich würde sagen, verwenden Sie das Array-Modul nur, wenn Sie es wirklich brauchen, in allen anderen Fällen bleiben Sie bei den Listen.

59
André

Das Array-Modul ist eine Art von Dingen, für die Sie wahrscheinlich keine Notwendigkeit haben, wenn Sie nicht wissen, warum Sie es verwenden würden (und beachten Sie, dass ich nicht versuche, das auf eine herablassende Weise zu sagen!) . In der Regel wird das Array-Modul für die Schnittstelle mit C-Code verwendet. Um Ihnen eine direktere Antwort auf Ihre Leistungsfrage zu geben:

Arrays sind für einige Zwecke effizienter als Listen. Wenn Sie ein Array zuweisen müssen, von dem Sie wissen, dass es sich nicht ändern wird, können Arrays schneller sein und weniger Speicherplatz beanspruchen. GvR hat eine Optimierungs-Anekdote , in der das Array-Modul als Gewinner hervorgeht (lange Lesezeit, aber es lohnt sich).

Andererseits ist der Grund, warum Listen mehr Speicher als Arrays verbrauchen, auch deshalb, weil Python einige zusätzliche Elemente zuweist, wenn alle zugewiesenen Elemente verwendet werden. Dies bedeutet, dass das Anhängen von Elementen an Listen schneller ist. Wenn Sie also Elemente hinzufügen möchten, ist eine Liste der Weg.

TL; DR Ich würde ein Array nur dann verwenden, wenn Sie einen außergewöhnlichen Optimierungsbedarf hatten oder eine Schnittstelle zu C-Code benötigen (und pyrex nicht verwenden können).

46
Jason Baker

Es ist ein Kompromiss!

profis von jedem:

liste

  • flexibel
  • kann heterogen sein

array (ex: numpy array)

  • array von einheitlichen Werten
  • homogen
  • kompakt (in der Größe)
  • effizient (Funktionalität und Geschwindigkeit)
  • praktisch
12
KouchakYazdi

Meines Wissens ist es so, dass Arrays effizienter gespeichert werden (d. H. Als zusammenhängende Speicherblöcke vs. Zeiger auf Python-Objekte), mir ist jedoch kein Leistungsvorteil bewusst. Außerdem müssen Sie bei Arrays Grundelemente des gleichen Typs speichern, wohingegen Listen alles speichern können.

12
Ben Hoffstein

Die Standardbibliotheksarrays sind für binäre E/A nützlich, z. B. zum Übersetzen einer Liste von Ints in eine Zeichenfolge, in die beispielsweise eine Wave-Datei geschrieben werden soll. Wie bereits erwähnt, sollten Sie, wenn Sie wirklich arbeiten, NumPy in Betracht ziehen.

7
giltay

Array kann nur für bestimmte Typen verwendet werden, während Listen für jedes Objekt verwendet werden können.

Arrays können auch nur Daten eines Typs enthalten, wohingegen eine Liste Einträge verschiedener Objekttypen enthalten kann.

Arrays sind auch für einige numerische Berechnungen effizienter.

5
Hortitude

Wenn Sie Arrays verwenden, sollten Sie die Pakete numpy oder scipy in Betracht ziehen, die Ihnen Arrays mit mehr Flexibilität bieten.

5
Alex Coventry

Ein wichtiger Unterschied zwischen einem numpy-Array und einer Liste besteht darin, dass Array-Slices Ansichten des ursprünglichen Arrays sind. Dies bedeutet, dass die Daten nicht kopiert werden und alle Änderungen an der Ansicht im Quell-Array angezeigt werden.

0
vivek