在Python中,为什么itertools.cycle需要额外的内存?

时间:2013-08-28 03:11:53

标签: python cycle itertools

我对itertools.cycle(iterable)中的警告感到好奇:

  

使迭代器返回来自的元素   可迭代并保存每个的副本。当iterable耗尽时   从保存的副本返回元素。无限期地重复。

     

相当于:

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

该条目还包含警告,“注意,该工具包的这个成员可能需要大量的辅助存储(取决于可迭代的长度)。”

您无法避免额外的存储要求(以及一些复杂性):

def cycle(iterable):
    while True:
        for i in iterable:
            yield i

saved中存储使用过的商品有什么好处?

2 个答案:

答案 0 :(得分:1)

有些迭代只能迭代一次。因此,循环将存储一个副本,以便它可以继续读取这些项目。 请参阅this related question

答案 1 :(得分:0)

可迭代可能是某些生成器,它会进行昂贵的计算以生成元素。

通过缓存可迭代的结果,您不必重复循环遍历迭代的可能是昂贵且耗时的操作。