将大型哈希列表与其他大型哈希列表进行比较

时间:2014-05-21 21:56:09

标签: list python-2.7

我有一个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不是多线程的。我有什么想法可以提高吞吐量吗?

1 个答案:

答案 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(...)