在Python中,什么时候应该使用生成器表达式,什么时候应该使用列表理解?
# Generator expression
(x*2 for x in range(256))
# List comprehension
[x*2 for x in range(256)]
发布于 2008-09-06 20:54:08
John's answer是好的(当你想要多次迭代一些东西时,列表理解会更好)。但是,还值得注意的是,如果您想使用任何list方法,就应该使用list。例如,以下代码将不起作用:
def gen():
return (something for something in get_some_stuff())
print gen()[:2] # generators don't support indexing or slicing
print [5,6] + gen() # generators can't be added to lists
基本上,如果您所做的只是迭代一次,则使用生成器表达式。如果您想存储和使用生成的结果,那么使用列表理解可能会更好。
由于性能是选择一个而不是另一个的最常见原因,我的建议是不要担心这一点,只选择一个;如果您发现程序运行太慢,那么也只有到那时,您才应该回去考虑代码的调优问题。
发布于 2008-09-06 20:10:59
当结果需要多次迭代时,或者速度非常重要时,请使用列表理解。在范围很大或无限大的地方使用生成器表达式。
发布于 2008-10-10 01:42:30
生成器表达式的好处是它使用较少的内存,因为它不会一次构建整个列表。生成器表达式最适合在列表作为中介时使用,例如对结果求和,或根据结果创建字典。
例如:
sum(x*2 for x in xrange(256))
dict( (k, some_func(k)) for k in some_list_of_keys )
这样做的好处是列表不是完全生成的,因此使用的内存很少(而且应该会更快)
但是,当期望的最终产品是列表时,您应该使用列表理解。您不会使用生成器表达式保存任何内存,因为您需要生成的列表。您还可以使用任何列表函数,如排序或反转。
例如:
reversed( [x*2 for x in xrange(256)] )
https://stackoverflow.com/questions/47789
复制相似问题