如何加快制作大字典

时间:2013-07-24 14:43:36

标签: python performance dictionary

我有一个大文件(大约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电话中。

有没有办法加快速度?

是否值得添加未分类的元素然后再排序?如果是这样,你如何对列表字典中的所有列表进行排序?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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]]

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