Как повысить производительность этой счетной программы?

Данный файл выглядит следующим образом:

1440927 1
1727557 3
1440927 2
9917156 4

Первое поле - это идентификатор, который равен в диапазоне (0, 200000000) . Второе поле представляет тип в диапазоне (1, 5) . Типы 1 и 2 относятся к общей категории S1 , а типы 3 и 4 относятся к S2 . Один идентификатор может иметь несколько записей разного типа. Размер файла составляет около 200 МБ.

Проблема состоит в том, чтобы подсчитать количество идентификаторов, для которых есть запись типа 1 или 2, и количество идентификаторов, которые имеют запись типа 3 или 4.

Мой код:

def gen(path):
    line_count = 0
    for line in open(path):
        tmp = line.split()
        id = int(tmp[0])
        yield id, int(tmp[1])

max_id = 200000000
S1 = bitarray.bitarray(max_id)
S2 = bitarray.bitarray(max_id)
for id, type in gen(path):
    if type != 3 and type != 4:
        S1[id] = True
    else:
        S2[id] = True

print S1.count(), S2.count()

Хотя он дает ответ, я думаю, что он работает немного медленно. Что мне делать, чтобы он работал быстрее?

РЕДАКТИРОВАТЬ: В файле есть повторяющиеся записи. И мне нужно только различать S1 (тип 1 и тип 2) и S2 (тип 3 и тип 4). Например, 1440927 1 и 1440927 2 учитываются только один раз, но не дважды, потому что они принадлежат S1. Поэтому мне нужно хранить идентификаторы.

7
задан amazingjxq 6 December 2011 в 10:02
поделиться