Re: [Python-de] Probleme mit listen
Wie ist das eigentlich intern, wird für jedes neue Listenelement Speicher angefordert oder wird bereits bei der erstmaligen Verwendung eine Liste bestimmter Größe erstellt und später dynamisch erweitert ? Wird ja immer empfohlen eine Liste bereits im Vorfeld zu initialisieren...
Alexander Langer, 25.10.2013 18:56:
Wie ist das eigentlich intern, wird für jedes neue Listenelement Speicher angefordert oder wird bereits bei der erstmaligen Verwendung eine Liste bestimmter Größe erstellt und später dynamisch erweitert ?
Wie ich schon schrieb, es wird immer etwas mehr angefordert als nötig, abhängig davon, wie viel schon da ist. Dadurch muss im Durchschnitt nur alle so-und-so viele Male der Speicherbereich vergrößert werden, was den Zusatzaufwand merklich senkt und unterm Strich einen nur leicht schlechteren als linearen Zeitaufwand liefert. Andernfalls wäre der Aufwand quadratisch, da bei jedem Anhängen schlimmstenfalls die komplette Liste in einen neuen (größeren) Speicherbereich kopiert werden müsste. Den genauen Algorithmus dazu kannst du dir im Code anschauen, steht sogar ein Kommentar dabei. Auch der Fall, dass zuerst viele Elemente angehängt und dann viele vom Ende wieder entfernt werden (z.B. mit pop) ist dadurch beschleunigt, dass die Liste nicht sofort bei jedem entnommenen Element wieder verkleinert wird, sondern erst, wenn z.B. nach dem Entfernen wieder neue Element angehängt werden, also der Entnahmezyklus offensichtlich beendet ist.
Wird ja immer empfohlen eine Liste bereits im Vorfeld zu initialisieren...
"immer" ist vielleicht etwas übertrieben. In einigen ausgewählten Fällen kann dies durchaus Sinn machen, aber ansonsten sollte diese Art der potentiell nutzlosen Code-Enthübschung eher vermieden werden. Stefan
Am 25.10.13 18:56, schrieb Alexander Langer:
Wie ist das eigentlich intern, wird für jedes neue Listenelement Speicher angefordert oder wird bereits bei der erstmaligen Verwendung eine Liste bestimmter Größe erstellt und später dynamisch erweitert ?
Man kann so was messen. Nehmen wir mal dieses Beispiel: length = 10 my_list= [] for elem in xrange(length): # in Python 3 bitte range nutzen my_list.append(elem) Dann ergeben sich für unterschiedliche Längen der erzeugten Liste folgen Anzahlen von Speicheranforderungen: length: allocations 10: 3 100: 10 1000: 27 10000: 46 100000: 65 1000000: 85 10000000: 104 (gemessen für CPython 2.7)
Wird ja immer empfohlen eine Liste bereits im Vorfeld zu initialisieren...
Python macht das quasi im Hintergrund. Die Liste ist also immer etwas größer als eigentlich nötig. Python nutzt mehr Speicher, um wesentlich schneller zu sein. Viele Grüße Mike
_______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de
participants (3)
-
Alexander Langer
-
Mike Müller
-
Stefan Behnel