0

ソートされたリストの辞書を作成するために、このように読み込む大きなファイル (約 1GB) があります。後で検索できるように、リストを並べ替える必要があります。これらは先行クエリ (x より小さい最大値を持つインデックス) になるため、セットは使用できません。

A = defaultdict(list)
B = defaultdict(list)
filename = sys.argv[1]

with open(filename) as fin:
    lines = list(fin)

for line in lines:
    vals=line.split()
    vals[2] = int(vals[2])
    bisect.insort_left(A[vals[1]],vals[2]]
    bisect.insort_left(B[vals[0]],vals[2]]

残念ながら、遅すぎます。

プロファイリング ほぼすべての時間がbisect.insort_left通話に費やされていることがわかります。

これをスピードアップする方法はありますか?

ソートされていない要素を追加して、後でソートする価値はありますか? もしそうなら、リストの辞書にあるすべてのリストをどのようにソートできますか?

4

2 に答える 2

2

1) ファイル全体を一度に読み込まず、2) 読み込みが完了した後に並べ替えるようにします。このような:

A = defaultdict(list)
B = defaultdict(list)
filename = sys.argv[1]

with open(filename) as fin:
    for line in fin:
      vals = line.split()
      vals[2] = int(vals[2])
      A[vals[1]].append(vals[2])
      B[vals[0]].append(vals[2])

for v in A.itervalues():
    v.sort();
for v in B.itervalues():
    v.sort()
于 2013-07-24T14:56:48.473 に答える