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 回答
0

尝试迭代而不先列出列表

with open(filename) as f:
  for line in f:
    vals=line.split()
    vals[2] = int(vals[2])
    bisect.insort_left(A[vals[1]],vals[2]]
    bisect.insort_left(B[vals[0]],vals[2]]

另一个想法是在所有插入完成后进行排序

于 2013-07-24T14:52:20.500 回答