Berechnungen „nach Bedarf“ oder faule Berechnungen wurden mit dem Anstieg der verarbeiteten Datenmengen populär. In Python wurden solche Mechanismen in der Standardbibliothek über Generatoren und Iteratoren implementiert, später durch die Funktion itertools und Klassen, die in der Lage sind, auf Anfrage ein Element zurückzugeben, wodurch die Speicherung aller Daten im Speicher gleichzeitig vermieden wird.
Der typische Aufbau von Sammlungen erfordert die Ladeung aller Ergebnisse im Speicher. Wenn das Volumen groß ist, kann das Programm „abstürzen“ oder sehr langsam arbeiten. Es ist wichtig, Datenströme zu verarbeiten – zum Beispiel Dateien mit vielen Gigabytes oder Ergebnisse von API-Anfragen.
Faule Berechnungen ermöglichen es, Elemente nach Bedarf zu erhalten. In Python wird dies durch die Verwendung von Generatoren, den yield-Syntax, Generatorausdrücken, sowie den Funktionen map, filter und zip sowie dem Modul itertools erleichtert. Dieser Ansatz basiert auf dem Iteratorenprotokoll.
Beispielcode:
def huge_sequence(): for i in range(1, 10**9): yield i * i for val in huge_sequence(): if val > 100: break print(val)
Wichtige Merkmale:
Sparen Generatoren in Python immer Speicher?
Antwort: Nein, nur wenn die Daten tatsächlich keine Zwischenablage zwischen den Schritten erfordern. Einige Konstruktionen, wie list comprehensions, erzeugen die gesamte Liste sofort, während Generatoren nur auf Anfrage erzeugt werden. Wenn die Zwischenresultate dennoch benötigt werden, geht die Einsparung verloren.
Beispiel:
squares = (x**2 for x in range(10**8)) # faul, sparsam result = list(squares) # verbraucht sofort gesamten Speicher
Ist es wahr, dass map und filter immer Listen zurückgeben?
Nein, in Python 3 geben map und filter keinen Liste, sondern einen Iterator (fauler Generator) zurück, was Speicher spart und das Bearbeiten von Daten „on the fly“ ermöglicht.
Kann man einen Generator mehrfach durchlaufen?
Nein, ein Generator „verbraucht sich“ nach einer vollständigen Durchläufung. Wenn eine Wiederholung erforderlich ist, sollte ein neuer Generator erzeugt oder eine Container-Sammlung verwendet werden, deren Inhalt man mehrmals durchlaufen kann.
Ein Entwickler versucht, eine große Log-Datei zu verarbeiten, indem er sie als Liste von Zeilen in den Speicher lädt.
Vorteile:
Nachteile:
Ein Generator wird verwendet – zeilenweises Lesen der Datei mit Verarbeitung jeder Zeile bei Erhalt.
Vorteile:
Nachteile: