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.array
Typ 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) * length
Speicherbytes. Meistens sollten Sie es verwenden, wenn Sie ein C-Array einer Erweiterung oder einem Systemaufruf aussetzen müssen (z. B. ioctl
oder fctnl
).
array.array
ist 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.array
Dies ist nützlich, wenn Sie aus anderen Gründen als zum Rechnen ein homogenes C-Array von Daten 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.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.
quelle
array
ist für nicht dazu gedacht , Mathe zu tun . Wenn Sie versuchen, mit NumPy'sndarray
ein Array von 10 ^ 8 Zahlen zu summieren, wird es vollständig wegblasenlist
. @tzot hat die richtige Vorstellung davon, warum das Eingebautearray
für Mathematik langsam ist.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 ).
quelle
Vorteile von jedem:
Liste
Array (Beispiel: Numpy Array)
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Diese Antwort fasst fast alle Fragen zusammen, wann List und Array verwendet werden sollen:
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.
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.
Sie können Werte verschiedener Datentypen in einer Liste speichern (heterogen), während Sie in Array nur Werte desselben Datentyps speichern können (homogen).
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.
Arrays benötigen im Vergleich zu Listen weniger Speicher.
quelle