ファイルは次のようになります。
1440927 1
1727557 3
1440927 2
9917156 4
最初のフィールドは ID ですin range(0, 200000000)
。2 番目のフィールドはタイプを表し、これはin range(1, 5)
です。また、タイプ 1 とタイプ 2 は共通のカテゴリS1
に属し、タイプ 3 とタイプ 4 は共通のカテゴリに属しS2
ます。1 つの 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
は 1 回だけカウントされますが、S1 に属しているため 2 回ではありません。そのため、ID を保存する必要があります。