2017-04-13 39 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