Por que o itertools.cycle do Python precisa criar uma cópia do iterável?

A documentação do itertools.cycle () do Python fornece uma implementação de pseudo-código como:

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

Abaixo, afirma: "Note que este membro do kit de ferramentas pode requerer armazenamento auxiliar significativo (dependendo da duração do iterável)."

Eu basicamente estava seguindo esse caminho, exceto que fiz isso, o que não requer a criação de uma cópia do iterável:

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

impressões:

1
2
3
1
2
3

Sim, percebo que minha implementação não funcionaria para str, mas poderia ser feita para. Estou mais curioso para saber por que cria outra cópia. Tenho a sensação de que isso tem a ver com a coleta de lixo, mas não estou bem estudado nessa área do Python.

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion