Ich habe diese beiden Implementierungen, die Länge eines endlichen Generator zu berechnen, während die Daten für die Weiterverarbeitung zu halten:Länge eines endlichen Generator
def count_generator1(generator):
'''- build a list with the generator data
- get the length of the data
- return both the length and the original data (in a list)
WARNING: the memory use is unbounded, and infinite generators will block this'''
l = list(generator)
return len(l), l
def count_generator2(generator):
'''- get two generators from the original generator
- get the length of the data from one of them
- return both the length and the original data, as returned by tee
WARNING: tee can use up an unbounded amount of memory, and infinite generators will block this'''
for_length, saved = itertools.tee(generator, 2)
return sum(1 for _ in for_length), saved
Beide haben Nachteile, die beide die Arbeit machen. Könnte jemand sie kommentieren oder sogar eine bessere Alternative anbieten?
Es gibt keine Möglichkeit, die Länge eines iterierbaren Generators zu kennen, ohne das Ganze zu verbrauchen. –
Ich weiß. Das ist nicht die Frage – dangonfast
hinweis: Wenn, wenn Sie nicht die genaue Länge benötigen, dann könnten Sie ['operator.length_hint()' (Python 3.4+)] (http://docs.python.org/dev/library /operator#operator.length_hint), die eine geschätzte Länge zurückgibt, ohne den Iterator zu verbrauchen. Siehe [PEP 424 - Eine Methode zum Freilegen eines Längenhinweises] (http://www.python.org/dev/peps/pep-0424/) – jfs