我有一个100,000个哈希列表(列表a),我希望将其与15,000,000个哈希值列表进行比较(列表b)。
散列取自列表a。如果它存在于列表b中,则不执行任何操作。如果列表b中不存在,则将其写入文件。
这是我到目前为止的逻辑:
def compareHashes(map, hashdb, out):
output_file = openFile(out)
line_cnt = 0
total_lines = len(map)
for m in map:
if m not in hashdb:
writeToFile(m + "\r\n", output_file)
sys.stdout.write("\r" + str(round(percentage(line_cnt, total_lines), 2)) + "%")
sys.stdout.flush()
line_cnt = line_cnt + 1
output_file.close()
它有效,但需要很长时间。我可以就如何提高性能提出一些建议吗?运行脚本的框有60GB的ram和8个内核。我不认为所有核心都被利用,因为python不是多线程的。我有什么想法可以提高吞吐量吗?
答案 0 :(得分:1)
首先,如果列表b中的元素不存在于列表b中,则表明您要写入文件。这可以在代码中表示为:
for a in list_a:
if a not in list_b:
writeFile(...)
在列表上使用 中的中缀运算符是O(n)复杂度计算。相反,在O(1)时间内使用 set ,一个关联(无序)数组和项目查找。
set_b = set(list_b)
for a in list_a:
if a not in set_b:
writeFile(...)
您还可以找到list_a
中不在list_b
内的所有项目,然后只对这些项目执行操作:
a_disjoint_b = set(list_a) - set(list_b)
for a in list_a:
if a in a_disjoint_b:
writeFile(...)
或者,如果list_a
中的项目顺序无关紧要,list_a
中的所有项目都是唯一的:
for a in set(list_a) - set(list_b):
writeFile(...)