Учитывая, что файл выглядит так:
1440927 1
1727557 3
1440927 2
9917156 4
Первое поле - это идентификатор, in range(0, 200000000)
. Второе поле представляет тип, который является in range(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()
Хотя он дает ответ, я думаю, что он работает немного медленно. Что я должен сделать, чтобы он работал быстрее?
EDIT:
В файле есть дублированные записи. И мне нужно только различать S1 (тип 1 и тип 2) и S2 (тип 3 и тип 4). Например, 1440927 1
и 1440927 2
учитываются только один раз, но не дважды, потому что они принадлежат S1. Поэтому я должен хранить идентификаторы.