给定一个看起来像这样的文件:
1440927 1
1727557 3
1440927 2
9917156 4
第一个字段是ID,其范围为
0至200000000
。第二个字段表示类型,其范围为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
和 1440927 2
只计算一次,而不是两次,因为它们属于S1。所以我必须存储ID。
id=int(...
,并改为使用yield int(tmp[0], ...
。你可以使用if type <= 2
代替两个比较。你可以完全删除生成器,并将代码内联到with open(...) as f:
块中。试一试吧。下面的评论也有一个关于bitarray的好观点^^ - hochl