Python中是否有一种方法可以同时生成多个输出。特别是我想要的东西:
my_gen =(i for i in range(10))
并说我有一个参数batch_size = 3
。我希望我的生成器输出:
my_gen.next()
0,1,2
my_gen.next()
3,4,5
my_gen.next()
6,7,8
my_gen.next()
9,10
在最后一个命令的位置,它只产生两个数字,因为即使batch_size
为3,也只剩下两个数字。
在itertools
page上有一个石斑鱼功能提供:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
然后,您可以制作您的发电机并用石斑鱼包裹它:
for my_tuple in grouper(my_gen, 3):
print([x for x in my_tuple if x is not None])
IMO,不需要任何图书馆。您可以只定义自己的批处理生成器
def batch_iter(batch_size, iter_):
yield [next(iter_) for _ in range(batch_size)]
只是
next(batch_iter(batch_size, x))
一个反复安全的版本
def batch_iter(batch_size, iter_):
r = []
for _ in range(b):
val = next(iter_, None)
if val is not None: r.append(val)
yield r
当然,如果你需要元组值,你可能会yield tuple(r)
而不仅仅是r
。你也可以添加一个else
子句和break
循环,因为一旦val
是None
,没有更多的值可以迭代
您可以将列表理解与生成器一起使用:
batch_size, max_size = 3, 10
my_gen = ([x for x in range(i, i + batch_size) if x <= max_size] for i in range(0, max_size, batch_size))
for x in my_gen:
print(x)