如何加速超过100k项目的两个dicts之间的比较

时间:2017-04-13 11:09:12

标签: python-2.7 csv dictionary

以下代码需要一段时间才能执行。 我试图识别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

请问如何加快比较?

3 个答案:

答案 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