2009-06-07 75 views
9

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

回答

12

一个与发电机的问题是,他们得到的 “消费”。这意味着如果您需要再次遍历序​​列,则需要再次创建生成器。

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

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

此外相当明显,如果您需要事先获得序列的长度,那么您不需要生成器。

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 
+0

+1好知道 – ebo 2009-06-07 13:15:39

1

当你想拥有的东西是iterateable,未持有在内存中的整个列表(这就是为什么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 

..can只是尽可能有效地重写..

def my_pointless_generator(x): 
    return range(x) 
相关问题