Dlaczego itertools.cycle Pythona musi utworzyć kopię iteracji?

Dokumentacja itertools.cycle () Pythona daje implementację pseudo-kodu jako:

def cycle(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...
    saved = []
    for element in iterable:
        yield element
        saved.append(element)
    while saved:
        for element in saved:
              yield element

Poniżej podano: „Uwaga, ten członek zestawu narzędzi może wymagać znacznej pamięci dyskowej (w zależności od długości iterowalnej).”

Zasadniczo podążałem tą ścieżką, z wyjątkiem tego, że to zrobiłem, co nie wymaga tworzenia kopii iterowanej:

def loop(iterable):
    it = iterable.__iter__()

    while True:
        try:
            yield it.next()
        except StopIteration:
            it = iterable.__iter__()
            yield it.next()

x = {1, 2, 3}

hard_limit = 6
for i in loop(x):
    if hard_limit <= 0:
        break

    print i
    hard_limit -= 1

wydruki:

1
2
3
1
2
3

Tak, zdaję sobie sprawę z tego, że moje wdrożenie nie będzie działać dla str, ale można to zrobić. Jestem ciekaw, dlaczego tworzy kolejną kopię. Mam wrażenie, że ma to związek ze zbieraniem śmieci, ale nie jestem dobrze zbadany w tej dziedzinie Pythona.

Dzięki!

questionAnswers(1)

yourAnswerToTheQuestion