2011-04-01 65 views
1

为了分摊函数调用开销,我改变了我的生成器,以便它产生一个固定长度的几个值列表,而不是一次产生一个值。发电机,就像它最初站立的那样,从一个包含几个腌制物体的文件中取出一个物体,并取出它。然后在消耗发生器的for循环中处理这些内容。这种方法比手动展开循环中的对象处理代码慢得多,该循环一次解除文件中多个连续的项目。我正在尝试妥协。我修改过的生成器一次产生一个固定长度的pickle对象列表。我正在寻找一种Pythonic的方式来在消费者方面解开未包装对象的数据包。如何在Python中使用捆绑/打包生成器?

有没有一种方法来解构这些数据包而没有额外的嵌套循环?我错误地假定*运营商将做到这一点,像这样:

for x in *packetizing_generator(): f(x) 

当然作品的嵌套循环,但我不知道是否有一个更短,更优雅的方式。

回答

1

我想这就是你在说的,让我知道如果我不在正确的轨道上。

for a, b, c in your_generator: 
    # do stuff 

假定your_generator产生的结果是一个正好3个项目的序列。

您可以构建一个发生器产生正是n项目在同一时间在你的for循环使用以下方法:

itertools.izip_longest(*[your_generator]*n) 

如果你的发电机同时不会产生一个单一的项目,你想改变它产生你使用的项目数如下:

itertools.izip_longest(*[itertools.chain(*your_generator)]*n) 

下面是一个例子:

>>> from itertools import izip_longest, chain, combinations 
>>> for a, b, c, d in izip_longest(*[chain(*combinations(range(4), 2))]*4): 
...  print a, b, c, d 
... 
0 1 0 2 
0 3 1 2 
1 3 2 3 

这需要一个发生器,最初一次产生两个项目,而一次产生四个元素。

+0

是的,但我想要'3'作为参数 – san 2011-04-01 20:52:02

+0

因此,发电机需要给出一个屈服长度参数?你一定要能够写出你的发电机,使其始终产生特定数量的项目。 – 2011-04-01 20:57:51

+0

是的。发生器被写入并完成。在消费者方面,我有一个嵌套循环。想知道是否有Pythonic解构这个数据包的方式 – san 2011-04-01 21:00:31