2011-04-01 61 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