我有一个大文件(大约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
电话中。
有没有办法加快速度?
是否值得添加未分类的元素然后再排序?如果是这样,你如何对列表字典中的所有列表进行排序?
答案 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]]
另一个想法是在完成所有插入后进行排序