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?

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.


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

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.


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 .


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).


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.


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


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.


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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.