Frage

Ich schreibe eine Python-Funktion, die in etwa so aussah

def foo(some_list):
   for i in range(0, len(some_list)):
       bar(some_list[i], i)

, so dass es hieß mit

x = [0, 1, 2, 3, ... ]
foo(x)

hatte ich angenommen, dass Indexzugriff von Listen war O(1), aber war überrascht, dass für große Listen zu finden war deutlich langsamer als erwartet.

Meine Frage ist also, wie geht es Python-Listen implementiert sind, und was ist die Laufzeitkomplexität der folgenden

  • Indexing: list[x]
  • Popping vom Ende: list.pop()
  • Popping von Anfang an: list.pop(0)
  • die Erweiterung der Liste: list.append(x)

Für zusätzliche Kredite, Spleißen oder willkürliche Pops.

War es hilfreich?

Lösung

gibt es eine sehr detaillierte Tabelle auf Python-Wiki , die Ihre Frage beantwortet.

Doch in Ihrem speziellen Beispiel sollten Sie enumerate verwenden, um einen Index eines iterable innerhalb einer Schleife zu erhalten. etwa so:

for i, item in enumerate(some_seq):
    bar(item, i)

Andere Tipps

Die Antwort ist "undefined". Die Python-Sprache definiert nicht die zugrunde liegende Implementierung. Hier sind einige Links zu einer Mailing-Liste Thread Sie interessiert sein könnten.

Auch der mehr Pythonic Weg, um Ihre Schleife zu schreiben, sei dies:

def foo(some_list):
   for item in some_list:
       bar(item)

Listen sind in der Tat O (1) zum Index - sie als Vektor mit Proportionalzuteilung umgesetzt werden, so führen viel wie man erwarten würde. Der wahrscheinliche Grund, warum Sie diesen Code fanden langsamer als der Anruf erwartet wird, „range(0, len(some_list))“.

range() erstellt eine neue Liste mit der angegebenen Größe, so dass, wenn some_list 1.000.000 Elemente hat, werden Sie eine neue Million Artikellisten erstellen vorne. Diese Verhaltensänderungen in python3 (Bereich ist ein Iterator), der äquivalent zu der python2 xrange , oder noch besser für Ihren Fall, enumerate

noch nicht äußern kann, so

Wenn Sie Index und Wert müssen dann enumerate verwenden:

for idx, item in enumerate(range(10, 100, 10)):
    print idx, item

Python-Liste eigentlich nichts anderes als Arrays. So

Indizierung dauert O (1)

für Pop und hängt wieder soll es O (1) gemäß der Dokumentation

Überprüfen Sie folgenden Link aus für Details:

http://dustycodes.wordpress.com / 2012/03/31 / Pythons-Daten-Strukturen-Komplexität-Analyse /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top