2009-05-12 7 views
88

In Python, wie groß kann ein Array/Liste bekommen? Ich brauche eine Anordnung von ungefähr 12000 Elementen. Kann ich Array/List-Methoden wie Sortierung usw. weiterhin ausführen?Wie groß kann ein Python Array bekommen?

+9

Es gibt einen großen Unterschied zwischen Arrays und Listen in Python. – recursive

Antwort

149

Gemäß der source code ist die maximale Größe einer Liste PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAX in pyport.h definiert ist ((size_t) -1)>>1

In regelmäßigem 32-Bit-System sein, das ist (4294967295/2)/4 oder 536870912.

Deshalb ist die maximale Größe einer Python-Liste auf einem 32-Bit- System ist 536,870,912 Elemente.

Solange die Anzahl der Elemente gleich oder niedriger ist, sollten alle Listenfunktionen korrekt funktionieren.

+2

Warum ist 'sizeof (PyObject *) == 4?'? Was bedeutet das? – Matt

+3

@Matt, ist die Anzahl der Bytes eines einzelnen 'PyObject *'. Das Ding ist ein so genannter Zeiger (Sie erkennen sie an dem Asterix am Ende). Zeiger sind 4 Byte lang und speichern eine Speicheradresse für das zugeordnete Objekt. Sie sind "nur" 4 Bytes lang, weil mit 4 Bytes jedes Element in einem Speicher von heutigen Computern adressiert werden kann. –

+0

Es ist erwähnenswert (wie Álvaro Justens Antwort darauf hinweist), dass auf anderen Maschinen, insbesondere bei 64-Bit-Systemen, der Wert von 'PY_SIZE_T_MAX' sehr groß sein kann. –

4

12000 Elemente ist nichts in Python ... und tatsächlich kann die Anzahl der Elemente so weit gehen, wie der Python-Interpreter Speicher auf Ihrem System hat.

1

Ich würde sagen, Sie sind nur durch die Gesamtmenge an verfügbarem RAM begrenzt. Je größer das Array, desto länger dauert es natürlich.

+3

Allgemein zutreffend, aber nicht alle - Anhängen bleibt unabhängig von der Größe des Arrays amortisiert. – cdleary

+0

Interessant, danke für den Kommentar. –

24

Sicher ist es OK. Eigentlich können Sie selbst sehen einfach:

l = range(12000) 
l = sorted(l, reverse=True) 

Ausführen der diese Zeilen auf meiner Maschine nahm:

real 0m0.036s 
user 0m0.024s 
sys 0m0.004s 

Aber sicher wie jeder sagte, anders. Je größer das Array ist, desto langsamer werden die Operationen.

+15

Das Timing kann irreführend sein - meistens wird der Python-Interpreter gestartet. Ein besserer Weg ist: python -m time it.py "l = range (12000); l = sortiert (l, reverse = True)". Auf meiner Maschine gibt dies etwa 1/20 der Zeit für dieses Beispiel. –

+3

@ dF, Sie haben Recht bezüglich der Genauigkeit. Danke, dass du das notiert hast. Ich wollte nur einen Punkt beweisen. Und das Beispiel beweist es. –

+8

@ dF: Super! 0.024s war viel zu lang für mich und ich bin froh, dass ich jetzt aufhören kann, mir darüber Sorgen zu machen. –

6

Im Casual Code habe ich Listen mit Millionen von Elementen erstellt. Ich glaube, dass Pythons Implementierung von Listen nur durch die Menge an Speicher auf Ihrem System gebunden ist.

Darüber hinaus sollte die Liste Methoden/Funktionen trotz der Größe der Liste funktionieren.

Wenn Sie Wert auf Leistung legen, kann es sich lohnen, in eine Bibliothek zu schauen, z. B. NumPy.

5

Performance characteristics for lists sind auf Effbot beschrieben.

Python-Listen sind tatsächlich als Vektor für schnellen wahlfreien Zugriff implementiert, so dass der Container im Grunde so viele Elemente enthält, wie Platz für Speicher vorhanden ist. (Sie benötigen Platz für die in der Liste enthaltenen Zeiger sowie Speicherplatz im Speicher für die Objekte, auf die verwiesen wird.)

Anfügen ist O(1) (amortisierte konstante Komplexität), Einfügen/Löschen aus der Mitte von Die Reihenfolge erfordert eine O(n) (lineare Komplexität) Neuordnung, die langsamer als die Anzahl der Elemente in Ihrer Liste wird.

Ihre Sortierfrage ist nuancierter, da die Vergleichsoperation eine unbegrenzte Zeit in Anspruch nehmen kann. Wenn Sie wirklich langsame Vergleiche durchführen, wird es eine lange Zeit dauern, obwohl es kein Fehler von ist.

Die Umkehrung benötigt nur die Zeit, die benötigt wird, um alle Zeiger in der Liste zu tauschen (notwendigerweise O(n) (lineare Komplexität), da Sie jeden Zeiger einmal berühren).

31

Da die Python documentation says:

sys.maxsize

die größte positive ganze Zahl ist von der Py_ssize_t Typ der Plattform unterstützt werden, und damit die maximale Größe Listen, Streicher, dicts, und viele andere Behälter können haben.

In meinem Computer (Linux x86_64):

>>> import sys 
>>> print sys.maxsize 
9223372036854775807 
+0

Wie beantwortet das die Frage – ldgorman

+3

@ ldgorman, 'sys.maxsize' ist die Antwort auf die Frage. Unterschiedliche Architekturen unterstützen unterschiedliche Maxima. –

+0

Gibt der von sys.maxsize zurückgegebene Wert die Menge an verfügbarem RAM auf dem Computer in irgendeiner Weise wieder? – GeoJohn

-8

Es gibt keine Beschränkung der Listennummer. Der Hauptgrund, der Ihren Fehler verursacht, ist der RAM. Bitte aktualisieren Sie Ihre Speichergröße.

+1

-1, weil es nicht wirklich die Frage beantwortet, und ist eigentlich irreführend, weil (wie von anderen Antworten gezeigt) Liste tatsächlich eine hat maximale Größe. –

Verwandte Themen