Python более быстрая альтернатива словарю? [дубликат]

этот вопрос уже есть ответ здесь:

Я делаю простую систему интеллектуального анализа настроений, используя Naive Bayes classifier.

для обучения моего классификатора у меня есть текстовый файл, где каждая строка содержит список токенов (сгенерированный из твита), и связанные настроения (0 для-ve, 4 для положительных).

например:

0 @ switchfoot http : //twitpic.com/2y1zl - Awww , that 's a bummer . You shoulda got David Carr of Third Day to do it . ; D
0 spring break in plain city ... it 's snowing
0 @ alydesigns i was out most of the day so did n't get much done
0 some1 hacked my account on aim now i have to make a new one
0 really do n't feel like getting up today ... but got to study to for tomorrows practical exam ...

Теперь, что я пытаюсь сделать для каждого токена, подсчитайте, сколько раз это происходит в положительном твите, и сколько раз это происходит в отрицательном твите. Затем я планирую использовать эти подсчеты для вычисления вероятностей. Я использую встроенный словарь для хранения этих подсчетов. Ключи-это токены, а значения-целочисленные массивы размера 2.

проблема в том, что этот код начинается довольно быстро, но продолжает замедляться, и когда он обработал около 200 тысяч твитов, он становится очень медленным - около 1 твита в секунду. Поскольку мой набор тренировок имеет 1,6 миллиона твитов, это слишком медленно. Код у меня такой:

def compute_counts(infile):
    f = open(infile)
    counts = {}
    i = 0
    for line in f:
        i = i + 1
        print(i)
        words = line.split(' ')
        for word in words[1:]:
            word = word.replace('\n', '').replace('\r', '')
            if words[0] == '0':
                if word in counts.keys():
                    counts[word][0] += 1
                else:
                    counts[word] = [1, 0]
            else:
                if word in counts.keys():
                    counts[word][1] += 1
                else:
                    counts[word] = [0, 1]
    return counts

что я могу сделать, чтобы сделать этот процесс быстрее? Лучшая структура данных?

Edit: не дубликат, вопрос не о чем-то быстрее, чем dict в общем случае, но в этом конкретном случае использования.

1 ответов


не используйте if word in counts.keys() Если вы это сделаете, вы в конечном итоге просматриваете последовательно ключи, что и есть dict должен избежать.

просто поставить if word in counts.

или использовать defaultdict. https://docs.python.org/2/library/collections.html#collections.defaultdict