给定一个文件如下所示:
1440927 1
1727557 3
1440927 2
9917156 4
第一个字段是一个 ID,即in range(0, 200000000)
. 第二个字段表示一个类型,即in range(1, 5)
. 并且类型1和类型2属于一个共同的范畴S1
,而类型3和类型4属于S2
。一个 ID 可能有多个不同类型的记录。该文件大小约为 200MB。
问题是计算具有类型 1 或 2 记录的 ID 数量,以及具有类型 3 或 4 记录的 ID 数量。
我的代码:
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
and1440927 2
只计算一次,而不是两次,因为它们属于 S1。所以我必须存储ID。