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?
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:
Entsprechend dem Quellcode beträgt die maximale Größe einer Liste PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
ist 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.
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.
PY_SSIZE_T_MAX
sehr hoch ist.
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
sys.maxsize
ist die Antwort auf die Frage. Unterschiedliche Architekturen unterstützen unterschiedliche Maxima.
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.
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 .
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).
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 list
und dict
auch gemäß der Dokumentation
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.
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
Es gibt keine Beschränkung der Listennummer. Der Hauptgrund, der Ihren Fehler verursacht, ist der RAM. Bitte aktualisieren Sie Ihre Speichergröße.
sizeof(PyObject*) == 4?
? Was bedeutet das?