2017-01-20 40 views
0

我一直在看collections.CounterCollections.Counter計數時吃發電機嗎?

我使用以下(簡化)代碼:

choices = ['foo', 'bar'] 

def generator(n=100000000): 
    yield random.choice(choices) 

counts = collections.Counter(generator()) 

現在我的問題,我在執行Counter需要發電機作爲輸入。首先將生成器轉換爲列表會佔用太多內存空間。

所以我想知道collections.Counter是否首先將數據轉換爲列表,然後'計數'或在計數時'吃'發生器。

如果它首先將數據轉換爲列表。我將如何最好地實施它,而不將它轉換爲列表。

+0

據我所知'計數器'吃生成器和計數同時。 –

+0

沒有'itertools.Counter'只有'collections.Counter' –

+0

你是對的。我改變了它 –

回答

3

不,您傳遞的迭代(不管是生成器還是其他可迭代對象)是而不是轉換爲列表。

沒有必要轉換可迭代;計數在迭代時完成。該實現是基本相同:

counts = {} 
for element in generator(): 
    if element in counts: 
     counts[element] += 1 
    else: 
     counts[element] = 1 

Counter()對象執行此快得多(計數代碼C實現)。