Данный файл выглядит следующим образом:
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. Поэтому мне нужно хранить идентификаторы.