Iterationsstrategien
Verständnis der Generator-Iteration
Die Iteration über Generatoren kann komplex sein, da es mehrere Strategien gibt, um Generatoren zurückzusetzen und wiederzuverwenden. Im Gegensatz zu Listen werden Generatoren nach einer einzigen Iteration verbraucht, was spezielle Techniken für das Zurücksetzen erfordert.
Grundlegende Iterationsmethoden
Methode 1: Neuerstellung des Generators
def number_generator():
yield from range(5)
## First iteration
gen1 = number_generator()
print(list(gen1)) ## [0, 1, 2, 3, 4]
## Second iteration requires recreating generator
gen2 = number_generator()
print(list(gen2)) ## [0, 1, 2, 3, 4]
import itertools
def number_generator():
yield from range(5)
## Create multiple independent iterators
gen1, gen2 = itertools.tee(number_generator())
print(list(gen1)) ## [0, 1, 2, 3, 4]
print(list(gen2)) ## [0, 1, 2, 3, 4]
Fortgeschrittene Iterationstechniken
Zwischenspeichern von Generatorergebnissen
def cached_generator():
cache = []
def generator():
for item in range(5):
cache.append(item)
yield item
return generator, cache
gen_func, result_cache = cached_generator()
gen = gen_func()
print(list(gen)) ## [0, 1, 2, 3, 4]
print(result_cache) ## [0, 1, 2, 3, 4]
Vergleich der Iterationsstrategien
Strategie |
Speichereffizienz |
Komplexität |
Wiederverwendbarkeit |
Neuerstellung des Generators |
Hoch |
Niedrig |
Mittel |
itertools.tee() |
Mittel |
Mittel |
Hoch |
Zwischenspeichern |
Niedrig |
Hoch |
Hoch |
Ablauf der Generator-Iteration
graph LR
A[Generator Creation] --> B{Iteration Started}
B --> |First Pass| C[Values Consumed]
C --> |Reset Needed| D[Recreate Generator]
D --> B
Best Practices
- Wählen Sie die Neuerstellung für einfache Generatoren.
- Verwenden Sie
itertools.tee()
für parallele Iterationen.
- Implementieren Sie benutzerdefiniertes Zwischenspeichern für komplexe Szenarien.
Leistungsüberlegungen
Bei LabEx empfehlen wir die Wahl der Iterationsstrategie basierend auf:
- Speicherbeschränkungen
- Rechenkomplexität
- Spezifischen Anwendungsanforderungen
Fehlerbehandlung bei Iterationen
def safe_generator():
try:
yield from range(5)
except GeneratorExit:
print("Generator closed")
gen = safe_generator()
list(gen) ## Normal iteration
gen.close() ## Explicit closure
Fortgeschrittene Technik: Generator-Wrapping
def generator_wrapper(gen_func):
def wrapper(*args, **kwargs):
return gen_func(*args, **kwargs)
return wrapper
@generator_wrapper
def repeatable_generator():
yield from range(3)