只是想学习,我想知道多处理是否会加速 这个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()
如果我将其标记为全局等,我仍然会收到错误消息。我很感激 建议!!
答案 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
并有同样的错误。