Ist es eine verknüpfte Liste, ein Array? Ich suchte herum und fand nur Leute, die raten. Meine C-Kenntnisse sind nicht gut genug, um den Quellcode zu betrachten.
181
Ist es eine verknüpfte Liste, ein Array? Ich suchte herum und fand nur Leute, die raten. Meine C-Kenntnisse sind nicht gut genug, um den Quellcode zu betrachten.
Es ist ein dynamisches Array . Praktischer Beweis: Die Indizierung dauert (natürlich mit extrem kleinen Unterschieden (0,0013 µs!)) Unabhängig vom Index dieselbe Zeit:
...>python -m timeit --setup="x = [None]*1000" "x[500]"
10000000 loops, best of 3: 0.0579 usec per loop
...>python -m timeit --setup="x = [None]*1000" "x[0]"
10000000 loops, best of 3: 0.0566 usec per loop
Ich wäre erstaunt, wenn IronPython oder Jython verknüpfte Listen verwenden würden - sie würden die Leistung vieler weit verbreiteter Bibliotheken ruinieren, die auf der Annahme beruhen, dass Listen dynamische Arrays sind.
x=[None]*1000
, so dass die Messung möglicher Listenzugriffsunterschiede eher ungenau bleibt . Sie müssen die Initialisierung trennen:-s "x=[None]*100" "x[0]"
Der C-Code ist eigentlich ziemlich einfach. Wenn Sie ein Makro erweitern und einige irrelevante Kommentare entfernen, befindet sich die Grundstruktur in
listobject.h
, die eine Liste definiert als:PyObject_HEAD
enthält einen Referenzzähler und eine Typkennung. Es ist also ein Vektor / Array, der insgesamt zugeordnet wird. Der Code zum Ändern der Größe eines solchen Arrays, wenn es voll ist, ist inlistobject.c
. Das Array wird nicht verdoppelt, sondern durch Zuweisung vergrößertauf die Kapazität jedes Mal, wo
newsize
ist die angeforderte Größe (nicht unbedingt,allocated + 1
weil Sieextend
durch eine beliebige Anzahl von Elementen können, anstattappend
sie einzeln zu geben).Siehe auch die Python-FAQ .
quelle
array
Modul oder NumPy vorzuziehen.In CPython sind Listen Arrays von Zeigern. Andere Implementierungen von Python können sie auf unterschiedliche Weise speichern.
quelle
Dies ist implementierungsabhängig, aber IIRC:
ArrayList
Somit haben alle O (1) Direktzugriff.
quelle
O(1)
Indizierung von Listen jedoch eine weit verbreitete und gültige Annahme ist, würde keine Implementierung es wagen, sie zu brechen.Ich würde Laurent Luces Artikel "Python List Implementation" vorschlagen . War für mich sehr nützlich, da der Autor erklärt, wie die Liste in CPython implementiert ist, und für diesen Zweck hervorragende Diagramme verwendet.
...
...
...
...
quelle
aggregation
, nichtcomposition
. Ich wünschte, es gäbe auch eine Liste mit Kompositionen.Laut Dokumentation ,
quelle
Wie andere oben angegeben haben, werden die Listen (wenn sie beträchtlich groß sind) implementiert, indem eine feste Menge an Speicherplatz zugewiesen wird und, falls dieser Speicherplatz gefüllt werden sollte, eine größere Menge an Speicherplatz zugewiesen und über die Elemente kopiert wird.
Um zu verstehen, warum die Methode ohne Verlust der Allgemeinheit O (1) amortisiert wird, nehmen wir an, dass wir a = 2 ^ n Elemente eingefügt haben und nun unsere Tabelle auf 2 ^ (n + 1) Größe verdoppeln müssen. Das heißt, wir führen derzeit 2 ^ (n + 1) Operationen aus. Letzte Kopie, wir haben 2 ^ n Operationen durchgeführt. Vorher haben wir 2 ^ (n-1) gemacht ... bis hinunter zu 8,4,2,1. Wenn wir diese addieren, erhalten wir 1 + 2 + 4 + 8 + ... + 2 ^ (n + 1) = 2 ^ (n + 2) - 1 <4 * 2 ^ n = O (2 ^ n) = O (a) Gesamtinsertionen (dh O (1) Amortisationszeit). Es sollte auch beachtet werden, dass, wenn die Tabelle Löschungen zulässt, das Schrumpfen der Tabelle mit einem anderen Faktor erfolgen muss (z. B. 3x).
quelle
Eine Liste in Python ist so etwas wie ein Array, in dem Sie mehrere Werte speichern können. Die Liste ist veränderbar, dh Sie können sie ändern. Das Wichtigste, was Sie wissen sollten, wenn wir eine Liste erstellen, erstellt Python automatisch eine Referenz-ID für diese Listenvariable. Wenn Sie es ändern, indem Sie eine andere Variable zuweisen, wird die Hauptliste geändert. Versuchen wir es mit einem Beispiel:
Wir fügen hinzu,
my_list
aber unsere Hauptliste hat sich geändert. Die Liste dieses Mittelwerts wurde nicht als Kopierliste zugewiesen, die als Referenz zugewiesen wurde.quelle
In CPython wird die Liste als dynamisches Array implementiert. Wenn wir zu diesem Zeitpunkt anhängen, wird nicht nur ein Makro hinzugefügt, sondern es wird etwas mehr Speicherplatz zugewiesen, sodass nicht jedes Mal neuer Speicherplatz hinzugefügt werden sollte.
quelle