多处理以加速循环

时间:2016-08-25 04:09:40

标签: python

只是想学习,我想知道多处理是否会加速 这个for循环,...试图比较 alexa_white_list(1,000,000行)和 dnsMISP(可以达到160,000行)

代码检查dnsMISP中的每一行,并在alexa_white_list中查找它。 如果它没有看到它,它会将其添加到黑名单。

没有mp_handler函数,代码工作正常,但需要 大约40-45分钟。为简洁起见,我省略了所有其他导入和 拉下并拉开alexa白名单的功能。

下面给出了以下错误 -   在mp_handler中输入“./vetdns.py”,第128行     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 个答案:

答案 0 :(得分: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))

使用set comprehension创建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时,您的程序必须遍历每个元素,直到它找到您要查找的内容或结束。这可能是您代码的最大瓶颈。

答案 1 :(得分:0)

您尝试读取名为dnsMISP的变量作为参数传递给Pool.map。它不存在于本地或全球范围内(您认为它来自哪里?),因此您获得了NameError。这与multiprocessing无关;你只需键入一行,但只能输入:

dnsMISP

并有同样的错误。