2017-04-13 23 views
0

以下代码需要一段时间才能执行。 我试图找出不在h_esmimsi字典中的c_imsi字典中的值,反之亦然。如何加速超过100k项目的两个字符之间的比较

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

我不知道它在内存中的效果如何,但它似乎比TLOwaters方法更快(通过我的两个30k元素列表测试约2倍),如果它只是目标找出哪些元素不在另一个列表。

output = {key: value for key,value in a.iteritems() if value not in b.viewvalues()} 
+0

谢谢C.Fe.(012)你的代码没有内存问题,速度大约快3倍。 从30分钟到10分钟左右。这很公平。 –

+0

@Austin Aigbe很高兴听到这个消息,我对Python非常陌生,所以它很棒,能够提供帮助。 –

0

如果你使用列表理解,你应该能够加快这个过程。只需使用以下格式:

output = [[k,v,k1,v1] for k, v in c_imsi.iteritems() for k1, v1 in h_esmimsi.iteritems() if v == v1] 

然后循环写入csv。

或者将字典写入“熊猫”数据框,然后在两个方向的值列上进行左连接。

+0

它消耗了大量的内存: '蟒蛇ldif_compare.py file1.ldif file2.ldif 回溯(最近通话最后一个) : 文件 “ldif_compare.py”,线178,在 export_to_csv() 文件 “ldif_compare.py”,线84,在export_to_csv O = [[K,v,K1,V1]如果v == V1别的[k,v,“ - ”,“ - ”]为k,v在c_imsi.iteritems()为k1,v1在h_esmimsi.iteritems()] MemoryError' –

+0

我正在寻找一种解决方案, F A足够了,至少不到一分钟就能跑。我的代码是高效的内存,但大约需要30分钟。 –

+0

如果你使用的代码我已经改变它应该少得多的内存很大(不知道为什么,但它也为我花了10GB的RAM)。我强烈建议寻找熊猫解决方案作为合并使用表是既有记忆效率,并在我的经验快得多。我最初的建议是尽快与列表进行比较。仅供参考“至少不到一分钟”是不会发生的。你正在做11-12亿次比较并写入一个csv文件;这将需要时间。修改后的方法花费了11分钟时间处理两套100,000个字典项目。 – TLOwater

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