说我有一个发电机sets
:
def f(n) : for i in xrange(n) : yield set(xrange(i) ) >>> for s in f(5) : print s set([]) set([0]) set([0, 1]) set([0, 1, 2]) set([0, 1, 2, 3])
现在我想要union
他们.我可以创建一个临时的集合列表,并将该列表解压缩为参数union
:
>>> set.union( * list( f(5) ) ) set([0, 1, 2, 3])
我也可以给发电机本身union
:
>>> set.union( * f(5) ) set([0, 1, 2, 3])
第二种方法是否像第一种方法一样创建完整的临时列表?哪种方法对内存有效?
Python 将它作为参数应用时首先展开生成器; 在两个选项中,生成器生成的所有值都会在调用发生之前加载到内存中.
您可以使用reduce()
函数调用:
from functools import reduce # Python 3 forward compatibility reduce(set.union, f(5))
这将f(5)
逐个迭代生成的值,而不首先构建它们的序列.
演示:
>>> def f(n): ... for i in xrange(n): ... yield set(xrange(i)) ... >>> reduce(set.union, f(5)) set([0, 1, 2, 3])