2016-08-25 68 views
-1

只是想學習,我「米不知道是否多將加快 了這個for循環,..嘗試比較 alexa_white_list(1,000,000線)和 dnsMISP(最多可以得到16萬行)多重加快for循環

代碼檢查dnsMISP每一行,並在alexa_white_list。 尋找它,如果它不看它,它增加了它的黑名單。

沒有mp_handler函數的代碼工作正常,但它需要 各地40- 45分鐘。爲了簡潔,我省略了所有其他進口和功能它可以下拉並解壓縮alexa白名單。

下面給我下面的錯誤 - 文件 「./vetdns.py」,線路128,在mp_handler p.map(dns_check,dnsMISP,alexa_white_list) NameError:全局名稱 'dnsMISP' 沒有定義

from multiprocessing import Pool 

def dns_check(): 
     awl = [] 
     blacklist = [] 
     ctr = 0 
     dnsMISP = open(INPUT_FILE,"r") 
     dns_misp_lines = dnsMISP.readlines() 
     dnsMISP.close() 
     alexa_white_list = open(outname, 'r') 
     alexa_white_list_lines = alexa_white_list.readlines() 
     alexa_white_list.close() 
     print "converting awl to proper format" 
     for line in alexa_white_list_lines: 
      awl.append(".".join(line.split(".")[-2:]).strip()) 
     print "done" 
     for host in dns_misp_lines: 
      host = host.strip() 
      host = ".".join(host.split(".")[-2:]) 
      if not host in awl: 
       blacklist.append(host) 
     file_out = open(FULL_FILENAME,"w")  
     file_out.write("\n".join(blacklist)) 
     file_out.close() 

def mp_handler(): 
    p = Pool(2) 
    p.map(dns_check,dnsMISP,alexa_white_list) 


if __name__ =='__main__': 
    mp_handler() 

如果我把它標記爲全局等,我仍然得到錯誤。我會很感激任何 的建議!

+2

多重處理可能無法幫助您,但將這些列表更改爲集將大大加快您的會員檢查 – IanAuld

+0

「Pool」。map'採用回調函數和迭代器作爲參數。你顯然沒有閱讀'multiprocessing'文檔,因爲你寫的東西沒有意義。哎呀,你傳遞了你從來沒有定義的參數,這似乎表明了一個基本的理解Python的失敗。 – ShadowRanger

回答

1

這裏不需要多處理。其實這個代碼可以大大簡化:

def get_host_form_line(line): 
    return line.strip().split(".", 1)[-1] 


def dns_check(): 
    with open('alexa.txt') as alexa: 
     awl = {get_host_from_line(line) for line in alexa} 
    blacklist = [] 
    with open(INPUT_FILE, "r") as dns_misp_lines: 
     for line in dns_misp_lines: 
      host = get_host_from_line(line) 
      if host not in awl: 
       blacklist.append(host) 
    with open(FULL_FILENAME,"w") as file_out:  
     file_out.write("\n".join(blacklist)) 

使用一套理解創建你的Alexa採集有被O(1)查找時間的優勢。集合與字典類似。他們是非常多字典,只有沒有值的鍵。在內存中有一些額外的開銷,並且初始創建時間可能會比較慢,因爲您放入集合的值需要進行散列處理和散列衝突處理,但從快速查找中獲得的性能提高應該可以彌補它。

你也可以清理你的行解析。 split()需要一個額外的參數來限制輸入分割的次數。我假設你的線條看起來像這樣:

http://www.something.com,你想something.com(如果不是這種情況讓我知道)

重要的是要記住,in運營商是不是魔術是很重要的。當你用它來檢查的成員(在列表中的一個元素)就是它的引擎蓋下基本上做的是這樣的:

for element in list: 
    if element == input: 
     return True 
return False 

因此,在你的代碼每次都if element in list你的程序必須在每個元素迭代,直到它要麼找到你正在尋找的東西,要麼到最後。這可能是你的代碼最大的瓶頸。

+0

你是男人,不能夠感謝你夠!我不得不改變一些東西,因爲我在上面和下面遺漏了多少代碼,但結果令人頭疼。在比較大約42分鐘之前,你的建議將其降低到不到一分鐘。如果你知道一個好的博客或者閱讀真正涉及'代碼背後'的內容,即解釋哈希表,我會非常感激!非常感謝!! – Dpitt1968

0

您試圖讀取一個名爲dnsMISP的變量作爲參數傳遞給Pool.map。它不存在於本地或全球範圍內(你認爲它來自哪裏?),所以你得到了NameError。這與multiprocessing無關;你可以只輸入一行,但是:

dnsMISP 

並且有相同的錯誤。

+0

顯然他認爲它來自'dnsMISP = open(INPUT_FILE,「r」)' – GreenAsJade

+0

@GreenAsJade:哪一個函數的局部變量尚未被調用... – ShadowRanger

+0

是的,我只是回答你的問題。我想如果你在答案中指出的話,你的答案會更有幫助。 – GreenAsJade