Python Generator - 什么不使用它

时间:2009-06-07 13:04:30

标签: python

只是看看Python生成器,真的给他们留下了深刻的印象,但有什么东西不能用它们吗?我在考虑过去的C编码,从文件中读取,或者用户操作是区域。例如,是否可以使用生成器来提示用户输入(基本数据输入?)和输入的调用函数进程?是否有任何表现或清理问题需要关注?

3 个答案:

答案 0 :(得分:13)

发电机不能很好地存在。

通常,在尝试保留生成器对象时会出错。

>>> def generatorForEvenKeys( aDictionary ):
    for k in aDictionary:
        if k % 2 == 0: yield aDictionary[k]

>>> x = generatorForEvenKeys( someDictionary )
>>> pickle.dump(x,file('temp.dat','wb'))

获取以下错误:

TypeError: can't pickle generator objects

答案 1 :(得分:12)

发电机的一个问题是它们被“消耗”了。这意味着如果您需要再次迭代序列,则需要再次创建生成器。

如果延迟评估是一个问题,那么您可能不需要生成器表达式。例如,如果您想预先执行所有计算(例如,以便您可以释放资源),那么列表推导或for循环可能是最佳的。

如果使用psyco,列表表达式和循环的速度会大幅提高,但对于生成器则不会。

另外很明显,如果您需要预先获得序列的长度,那么您不需要生成器。

答案 2 :(得分:1)

当你想要一些可迭代的东西时,你可以使用一个生成器,而不需要将整个列表保存在内存中(这就是为什么xrange支持比Python 2.x及更低版本中的range更长的序列的原因

当你需要将整个“东西列表”加载到内存中时,使用生成器没什么意义 - 你也可以只返回一个列表。

对于一个(略显人为的)例子:

def my_pointless_generator(x):
    thedata = range(x) # or thedata = list(range(x)) in Python 3.x
    for x in thedata:
        yield x

..可以像...一样有效地重写。

def my_pointless_generator(x):
    return range(x)