Python List vs. Array - wann verwenden?

374

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, unter dem ich stattdessen das Array-Modul verwenden möchte?

Ist es für die Leistungs- und Speicheroptimierung oder fehlt mir etwas Offensichtliches?

Corey Goldberg
quelle

Antworten:

438

Grundsätzlich sind Python-Listen sehr flexibel und können vollständig heterogene, willkürliche Daten enthalten. Sie können sehr effizient in einer amortisierten konstanten Zeit angehängt werden . Wenn Sie Ihre Liste zeiteffizient und problemlos verkleinern und erweitern müssen, sind sie der richtige Weg. Sie benötigen jedoch viel mehr Platz als C-Arrays .

Der array.arrayTyp ist dagegen nur ein dünner Wrapper auf C-Arrays. Es kann nur homogene Daten vom gleichen Typ enthalten und verwendet daher nur sizeof(one object) * lengthSpeicherbytes. Meistens sollten Sie es verwenden, wenn Sie ein C-Array einer Erweiterung oder einem Systemaufruf aussetzen müssen (z. B. ioctloder fctnl).

array.arrayist auch eine vernünftige Möglichkeit, eine veränderbare Zeichenfolge in Python 2.x ( array('B', bytes)) darzustellen . Python 2.6+ und 3.x bieten jedoch eine veränderbare Byte- Zeichenfolge als bytearray.

Wenn Sie jedoch mit einem homogenen Array numerischer Daten rechnen möchten , ist es viel besser, NumPy zu verwenden, mit dem Operationen auf komplexen mehrdimensionalen Arrays automatisch vektorisiert werden können.

Um es kurz zu machen : array.arrayDies ist nützlich, wenn Sie aus anderen Gründen als zum Rechnen ein homogenes C-Array von Daten benötigen .

Dan Lenski
quelle
9
Hat numpy.ndarray den gleichen Speicherbedarf wie array.array?
Gordon Bean
6
@ Gordon, es sollte im Fall eines großen, zusammenhängenden Arrays sehr ähnlich sein: Beide benötigen sizeof(element)× (Anzahl der Elemente) Bytes plus einen kleinen festen Header für den Overhead. Ndarray bietet jedoch einige erweiterte Optionen für den Umgang mit nicht zusammenhängenden und spärlichen Arrays, und ich denke, einige steckbare Strategien für die Zuweisung von Speicher für große Arrays ... einige dieser erweiterten Funktionen führen dazu, dass der Benutzer weniger Speicher benötigt, während andere die Leistung verbessern, indem sie mehr verwenden Erinnerung.
Dan Lenski
Auch nützlich, wenn Speicher ein Problem ist, wie beim Programmieren von Mikrocontrollern mit Micropython
janscas
Man kann das i-te Element eines Arrays in einer konstanten Zeit nachschlagen, während es in der verknüpften Liste im schlimmsten Fall die Reihenfolge 'n' annimmt. Was ist die Suchzeit des i-ten Elements in einer Python-Liste?
Nithish Inpursuit Ofhappiness
7
@NithishInpursuitOfhappiness, eine Python-Liste ist keine verknüpfte Liste. Es wird intern als Array dargestellt und hat die gleichen zeitlichen Komplexitätsmerkmale wie die ArrayList von Java. Das Abrufen und Festlegen des i-ten Elements einer Python-Liste dauert daher konstant . Das Anhängen eines Elements an eine Python-Liste benötigt amortisierte konstante Zeit, da die Array-Größe verdoppelt wird, wenn der Speicherplatz knapp wird. Das Einfügen oder Entfernen eines Elements in die Mitte einer Python-Liste dauert O (n), da Elemente verschoben werden müssen. Referenz: wiki.python.org/moin/TimeComplexity
geofflee
66

In fast allen Fällen ist die normale Liste die richtige Wahl. Das Arrays-Modul ähnelt eher einem Thin Wrapper über C-Arrays, mit dem Sie stark typisierte Container (siehe Dokumente ) erhalten und auf mehr C-ähnliche Typen wie signierte / nicht signierte Short- oder Double-Typen zugreifen können, die nicht Teil des Builds sind -in Typen. Ich würde sagen, verwenden Sie das Arrays-Modul nur, wenn Sie es wirklich brauchen, in allen anderen Fällen bleiben Sie bei Listen.

André
quelle
3
Möglich, habe es zwar nie wirklich benutzt, wäre aber interessant, einige Mikro-Benchmarks durchzuführen.
André
13
Eigentlich habe ich einen Schnelltest durchgeführt - ich habe eine Liste mit 100 Millionen Einträgen und denselben Test mit dem entsprechenden Array zeitlich festgelegt, und die Liste war tatsächlich etwa 10% schneller.
Moe
38
Listen sind schneller, da Operationen an "Rohdaten" des Arrays beim Lesen oder Schreiben aus dem Array kontinuierlich Python-Objekte erstellen und zerstören müssen.
Zot
7
@Moe, wie ich zeigte oben in meiner Antwort aus, Python eingebauten in arrayist für nicht dazu gedacht , Mathe zu tun . Wenn Sie versuchen, mit NumPy's ndarrayein Array von 10 ^ 8 Zahlen zu summieren, wird es vollständig wegblasen list. @tzot hat die richtige Vorstellung davon, warum das Eingebaute arrayfür Mathematik langsam ist.
Dan Lenski
2
Ich habe es gerade getestet, numpy ist auf meinem Computer 86,6x schneller.
Mark
53

Das Array-Modul ist eines der Dinge, die Sie wahrscheinlich nicht brauchen, wenn Sie nicht wissen, warum Sie es verwenden würden (und beachten Sie, dass ich nicht versuche, das herablassend zu sagen!). . Meistens wird das Array-Modul zur Schnittstelle mit C-Code verwendet. Um Ihnen eine direktere Antwort auf Ihre Frage zur Leistung zu geben:

Arrays sind für einige Verwendungszwecke effizienter als Listen. Wenn Sie ein Array zuweisen müssen, von dem Sie wissen, dass es sich nicht ändert, können Arrays schneller sein und weniger Speicher verbrauchen. GvR hat eine Optimierungsanekdote, in der das Array-Modul als Sieger hervorgeht (lange gelesen, aber es lohnt sich).

Andererseits ist ein Teil des Grundes, warum Listen mehr Speicher als Arrays verbrauchen, der, dass 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 richtige Weg.

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

Jason Baker
quelle
1
+1 für konkretes Beispiel und Erwähnung des Geschwindigkeitsvorteils. Die beste Antwort ließ mich fragen: "Gibt es einen Zeit-Gedächtnis-Kompromiss?" und "Gibt es eine Verwendung dafür, die kein sehr esoterischer Fall mit wenig Speicher ist?"
Leez
@leewz genau, dies sollte als Antwort betrachtet werden.
Gauri Shankar Badola
21

Es ist ein Kompromiss!

Vorteile von jedem:

Liste

  • flexibel
  • kann heterogen sein

Array (Beispiel: Numpy Array)

  • Array von einheitlichen Werten
  • homogen
  • kompakt (in der Größe)
  • effizient (Funktionalität und Geschwindigkeit)
  • praktisch
Mohammad Mahdi KouchakYazdi
quelle
2
Die Frage bezieht sich auf das Array-Modul in Python. keine numpy Arrays. Sie haben nicht viele Profis außer Größeneffizienz. Sie sind nicht schneller.
NONONONONO
14

Mein Verständnis ist, dass Arrays effizienter gespeichert werden (dh als zusammenhängende Speicherblöcke im Vergleich zu Zeigern auf Python-Objekte), aber mir sind keine Leistungsvorteile bekannt. Darüber hinaus müssen Sie bei Arrays Grundelemente desselben Typs speichern, während Listen alles speichern können.

Ben Hoffstein
quelle
8

Die Standardbibliotheksarrays sind nützlich für binäre E / A, z. B. zum Übersetzen einer Liste von Ints in eine Zeichenfolge, die beispielsweise in eine Wave-Datei geschrieben werden soll. Wie viele bereits bemerkt haben, sollten Sie jedoch die Verwendung von NumPy in Betracht ziehen, wenn Sie echte Arbeit leisten möchten.

vergoldet
quelle
6

Wenn Sie Arrays verwenden möchten, sollten Sie die Numpy- oder Scipy-Pakete in Betracht ziehen, die Ihnen Arrays mit viel mehr Flexibilität bieten.

Alex Coventry
quelle
5

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, während eine Liste Einträge verschiedener Objekttypen enthalten kann.

Arrays sind auch für einige numerische Berechnungen effizienter.

Hortitude
quelle
4
Die eingebauten Python-Arrays sind nicht leistungsmäßig effizient, sondern nur speichertechnisch.
Zot
Es gibt Fälle, in denen Arrays in Bezug auf die Verarbeitung effizienter sind. Siehe meinen Beitrag unten: stackoverflow.com/questions/176011/…
Jason Baker
0

Ein wichtiger Unterschied zwischen Numpy-Array und 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 Quellarray übernommen werden.

vivek
quelle
0

Diese Antwort fasst fast alle Fragen zusammen, wann List und Array verwendet werden sollen:

  1. Der Hauptunterschied zwischen diesen beiden Datentypen besteht in den Vorgängen, die Sie mit ihnen ausführen können. Sie können beispielsweise ein Array durch 3 teilen und jedes Element des Arrays durch 3 teilen. Dies kann mit der Liste nicht durchgeführt werden.

  2. Die Liste ist Teil der Python-Syntax, sodass sie nicht deklariert werden muss, während Sie das Array deklarieren müssen, bevor Sie es verwenden können.

  3. Sie können Werte verschiedener Datentypen in einer Liste speichern (heterogen), während Sie in Array nur Werte desselben Datentyps speichern können (homogen).

  4. Arrays sind reich an Funktionen und schnell und werden im Vergleich zur Liste häufig für arithmetische Operationen und zum Speichern einer großen Datenmenge verwendet.

  5. Arrays benötigen im Vergleich zu Listen weniger Speicher.

Dipen Gajjar
quelle