Wie groß kann eine Python-Liste werden?

119

Wie groß kann eine Liste in Python werden? Ich brauche eine Liste von ungefähr 12000 Elementen. Kann ich weiterhin Listenmethoden wie Sortieren usw. ausführen?

Hingebungsvoll
quelle

Antworten:

193

Entsprechend dem Quellcode beträgt die maximale Größe einer Liste PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXist in pyport.h definiert zu sein((size_t) -1)>>1

Auf einem normalen 32-Bit-System ist dies (4294967295/2) / 4 oder 536870912.

Daher beträgt die maximale Größe einer Python-Liste auf einem 32-Bit-System 536.870.912 Elemente.

Solange die Anzahl Ihrer Elemente gleich oder darunter liegt, sollten alle Listenfunktionen ordnungsgemäß funktionieren.

Unbekannt
quelle
4
Warum ist sizeof(PyObject*) == 4?? Was bedeutet das?
Matt
4
@Matt, ist die Anzahl der Bytes eines einzelnen PyObject *. Das Ding ist ein sogenannter Zeiger (man erkennt sie am Sternchen am Ende). Zeiger sind 4 Byte lang und speichern eine Speicheradresse für das zugewiesene Objekt. Sie sind "nur" 4 Bytes lang, weil Sie mit 4 Bytes jedes Element in einem Speicher heutiger Computer adressieren können.
Antonio Ragagnin
1
Es ist erwähnenswert (wie aus der Antwort von Álvaro Justen hervorgeht), dass auf anderen Computern, insbesondere auf Computern mit 64-Bit-Systemen, der Wert von PY_SSIZE_T_MAXsehr hoch ist.
ClydeTheGhost
@ClydeTheGhost, können Sie angeben, ob 64-Bit-Systeme auch eine niedrigere maximale Größe als die 536.870.912 Elemente haben können? Oder dass sie stark variieren können und dennoch immer eine maximale Größe haben, die gleich oder größer als 536.870.912 Elemente ist?
am
1
@at Das Maximum für ein 64-Bit-System ist immer gleich oder größer als für ein 32-Bit-System.
ClydeTheGhost
71

Wie die Python-Dokumentation sagt :

sys.maxsize

Die größte positive Ganzzahl, die vom Py_ssize_t-Typ der Plattform unterstützt wird, und somit die Listen mit maximaler Größe, Zeichenfolgen, Dicts und vielen anderen Containern.

Auf meinem Computer (Linux x86_64):

>>> import sys
>>> print sys.maxsize
9223372036854775807
Álvaro Justen
quelle
Wie beantwortet dies die Frage
ldgorman
11
@ldgorman, sys.maxsizeist die Antwort auf die Frage. Unterschiedliche Architekturen unterstützen unterschiedliche Maxima.
Simon Kuang
2
9223372036854775807 Elemente? "Ja wirklich?" Dies unterscheidet sich auch stark von der am besten bewerteten Antwort.
Akki
13
@akki Die akzeptierte Antwort bezieht sich auf ein 32-Bit-System. Da es 2016 ist, gehe ich davon aus, dass Sie sich auf einem 64-Bit-System befinden und die Antwort daher richtig ist
Brian Leach
2
Dies sollte Antwort ausgewählt werden.
Lokesh
26

Sicher ist es OK. Eigentlich können Sie sich leicht selbst davon überzeugen:

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

Das Ausführen dieser Zeilen auf meinem Computer dauerte:

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

Aber sicher, wie alle anderen sagten. Je größer das Array, desto langsamer werden die Operationen.

Nadia Alramli
quelle
20
Das Timing auf diese Weise kann irreführend sein - die meiste Zeit wird für das Starten des Python-Interpreters aufgewendet. Ein besserer Weg ist: python -m timeit.py "l = Bereich (12000); l = sortiert (l, umgekehrt = wahr)". Auf meinem Computer gibt dies ungefähr 1/20 der Zeit für dieses Beispiel an.
dF.
5
@dF, Sie haben Recht mit der Genauigkeit. Vielen Dank, dass Sie das bemerkt haben. Ich wollte nur einen Punkt beweisen. Und das Beispiel beweist es.
Nadia Alramli
13
@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.
Thomas Edleson
6

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

Darüber hinaus sollten die Listenmethoden / -funktionen trotz der Größe der Liste weiterhin funktionieren.

Wenn Sie Wert auf Leistung legen, lohnt es sich möglicherweise, in eine Bibliothek wie NumPy zu schauen .

Doug
quelle
5

Leistungsmerkmale für Listen werden in Effbot beschrieben.

Python-Listen werden tatsächlich als Vektor für den schnellen Direktzugriff implementiert, sodass der Container grundsätzlich so viele Elemente enthält, wie im Speicherplatz Platz ist. (Sie benötigen Platz für die in der Liste enthaltenen Zeiger sowie Speicherplatz für die Objekte, auf die verwiesen wird.)

Das Anhängen ist O(1)(amortisierte konstante Komplexität). Das Einfügen in / Löschen aus der Mitte der Sequenz erfordert jedoch eine O(n)Neuordnung (lineare Komplexität), die mit der Anzahl der Elemente in Ihrer Liste langsamer wird.

Ihre Sortierfrage ist nuancierter, da der Vergleichsvorgang unbegrenzt lange dauern kann. Wenn Sie sehr langsame Vergleiche durchführen, dauert es lange, obwohl der Listendatentyp von Python nicht fehlerhaft ist .

Die Umkehrung benötigt nur die Zeit, die erforderlich ist, um alle Zeiger in der Liste auszutauschen (unbedingt O(n)(lineare Komplexität), da Sie jeden Zeiger einmal berühren).

cdleary
quelle
4

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

AlbertoPL
quelle
3

Es variiert für verschiedene Systeme (abhängig vom RAM). Der einfachste Weg, dies herauszufinden, ist

import six six.MAXSIZE 9223372036854775807 Dies ergibt die maximale Größe von listund dictauch gemäß der Dokumentation

Yunus
quelle
1
das ist nicht die Dokumentation
Boris
1

Ich würde sagen, Sie sind nur durch die insgesamt verfügbare RAM-Größe begrenzt. Je größer das Array, desto länger dauert es natürlich.

Wayne Koorts
quelle
4
Im Allgemeinen wahr, aber nicht alle - das Anhängen bleibt unabhängig von der Größe des Arrays zeitlich amortisiert.
CDLeary
0

Ich habe dies von hier auf einem x64-Bit-System erhalten: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31. Mai 2018, 01:54:01) [MSC v.1913 64-Bit (AMD64)] auf win32

Geben Sie hier die Bildbeschreibung ein

user2063329
quelle
1
Dies wäre eine großartige Antwort, wenn Sie die Details etwas erweitern und erläutern würden, wie andere ihre eigenen Grenzen finden könnten.
Shayaan
-16

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

Haimei
quelle
9
-1, weil es die Frage nicht wirklich beantwortet und tatsächlich irreführend ist, weil die Liste (wie durch andere Antworten gezeigt) tatsächlich eine maximale Größe hat.
ClydeTheGhost