2017-01-20 2 views
0

Я смотрел collections.Counter.Имеет ли коллекции. Каунтер есть генератор при подсчете?

Я использую следующий (упрощенный) код:

choices = ['foo', 'bar'] 

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

counts = collections.Counter(generator()) 

Теперь мой вопрос, в моей реализации Counter принимает генератор в качестве входных данных. Для первого преобразования генератора в список потребуется слишком много места в памяти.

Итак, интересно, collections.Counter сначала преобразует данные в список, а затем «подсчитывает» или «ест» генератор при подсчете.

Если он сначала преобразует данные в список. Как мне лучше всего реализовать его, не переведя его в список.

+0

Насколько я знаю, 'Counter' ест генератор и подсчитывает между тем. –

+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).

Смежные вопросы