以下代码需要一段时间才能执行。 我试图识别c_imsi dict中不在h_esmimsi dict中的值,反之亦然。
c_imsi和h_esmimsi有超过100,000个条目。
c_imsi = {1:' 36565',2:' 34545',...,1011456:' 65342',...} h_emsimsi = {1:' 36545',2:' 34545',...,1011456:' 36565',...}
for k, v in c_imsi.iteritems():
for k1, v1 in h_esmimsi.iteritems():
if v == v1:
matchfound = True
write_csv.writerow([k1,v1,h_esmmsisdn[k1],'',k,v,c_msisdn[k],'OK'])
break
if matchfound == False:
write_csv.writerow(['-','-','-','',k,v,c_msisdn[k],'NOK'])
matchfound = False
for k, v in h_esmimsi.iteritems():
for k1, v1 in c_imsi.iteritems():
if v == v1:
matchfound = True
break
if matchfound == False:
write_csv.writerow([k,v,h_esmmsisdn[k],'','-','-','-','NOK'])
matchfound = False
请问如何加快比较?
答案 0 :(得分:1)
我不知道它在内存中的效果如何,但它似乎比TLOwaters方法更快(通过我测试两个30k元素列表大约2x),如果只是找出哪些元素不在其他清单。
output = {key: value for key,value in a.iteritems() if value not in b.viewvalues()}
答案 1 :(得分:0)
如果你使用列表理解,你应该能够加快这个过程。只需使用表格:
output = [[k,v,k1,v1] for k, v in c_imsi.iteritems() for k1, v1 in h_esmimsi.iteritems() if v == v1]
然后循环写入csv。
或者将字典写入“pandas”数据框,并在值列的两个方向上执行左连接。
答案 2 :(得分:0)
为什么不以相反的方式将值放入字典?字典将占用适量的内存,但速度非常快:
reversed_dict = {v:k for v,k in h_esmimsi.iteritems()}
for k, v in c_imsi.iteritems():
try:
k1 = reversed_dict[v]
except KeyError:
# NOK
else:
# OK
reversed_dict = {v:k for v,k in c_imsi.iteritems()}
for k, v in h_esmimsi.iteritems():
try:
k1 = reversed_dict[v]
except KeyError:
# NOK
else:
# OK