Was kostet die len()
Funktion von Python-Integrationen? (Liste / Tupel / String / Wörterbuch)
290
Was kostet die len()
Funktion von Python-Integrationen? (Liste / Tupel / String / Wörterbuch)
Es ist O (1) (konstante Zeit, nicht abhängig von der tatsächlichen Länge des Elements - sehr schnell) für jeden Typ, den Sie erwähnt haben, plus set
und andere wie array.array
.
Das Aufrufen von len () für diese Datentypen ist O (1) in CPython , der am häufigsten verwendeten Implementierung der Python-Sprache. Hier ist ein Link zu einer Tabelle, die die algorithmische Komplexität vieler verschiedener Funktionen in CPython bereitstellt:
TimeComplexity Python-Wiki-Seite
quelle
Alle diese Objekte verfolgen ihre eigene Länge. Die Zeit zum Extrahieren der Länge ist gering (O (1) in Big-O-Notation) und besteht hauptsächlich aus [grobe Beschreibung, geschrieben in Python-Begriffen, nicht in C-Begriffen]: Suchen Sie in einem Wörterbuch nach "len" und senden Sie es an das built_in len Funktion, die die
__len__
Methode des Objekts nachschlägt und das aufruft ... alles, was es tun muss, istreturn self.length
quelle
length
im Wörterbuch vondir(list)
?list.lenght
Variable ist in C implementiert, nicht in Python.Die folgenden Messungen liefern den Nachweis, dass
len()
O (1) für häufig verwendete Datenstrukturen ist.Ein Hinweis zu
timeit
: Wenn das-s
Flag verwendet wird und zwei Zeichenfolgen antimeit
die erste Zeichenfolge übergeben werden, wird dies nur einmal ausgeführt und ist nicht zeitgesteuert.Aufführen:
Tupel:
String:
Wörterbuch (Wörterbuchverständnis verfügbar ab 2.7):
Array:
Set (Set-Verständnis verfügbar ab 2.7):
Deque:
quelle
len()
und korrigierte auch die Messungen, um das-s
Flag richtig zu verwenden .python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
223 ns pro Schleifepython -m timeit -s "l = range(100);" "len(l)"
66,2 ns pro Schleifelen ist ein O (1), da Listen in Ihrem RAM als Tabellen (Reihe zusammenhängender Adressen) gespeichert werden . Um zu wissen, wann der Tisch stoppt, benötigt der Computer zwei Dinge: Länge und Startpunkt. Aus diesem Grund ist len () ein O (1), der Computer speichert den Wert und muss ihn nur nachschlagen.
quelle
Ich habe an len () in Python gedacht, das von der Größe der Liste abhängt. Daher speichere ich die Länge immer in einer Variablen, wenn ich sie mehrmals verwende. Aber heute habe ich beim Debuggen das Attribut __len__ im Listenobjekt bemerkt, daher muss len () es nur abrufen, was die Komplexität O (1) macht. Also habe ich nur gegoogelt, wenn jemand schon danach gefragt hat und auf diesen Beitrag gestoßen ist.
quelle
__len__
ist eine Funktion, keine Variable, die die Länge einer Liste darstellt.list.__len__
Funktion in konstanter Zeit ausgeführt wird? Es tut es, aber nicht nur, weil es eine Funktion ist. Weil es so umgesetzt wurde.