两个列表,在python中更快的比较

时间:2016-05-09 20:56:58

标签: python performance python-2.7 comparison

我正在编写python(2.7)脚本来比较两个列表。这些列表是通过阅读其内容从文件创建的。文件只是文本文件,没有二进制文件。文件1仅包含哈希值(某些明文字的MD5和),文件2是哈希:plain。列表有不同的长度(逻辑上,我可以减少'破解'条目而不是哈希)并且两者都不能排序,因为我必须保留顺序,但这是我和#39的下一步;我试图实现。到目前为止,我的简单代码看起来像这样:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os

def ifexists(fname):
    if not os.path.isfile(fname):
        print('[-] %s must exist' % fname)
        sys.exit(1)

if len(sys.argv) < 2:
    print('[-] please provide CRACKED and HASHES files')
    sys.exit(1)

CRACKED=sys.argv[1]
HASHES=sys.argv[2]

sk_ifexists(CRACKED)
sk_ifexists(HASHES)

with open(CRACKED) as cracked, open(HASHES) as hashes:
    hashdata=hashes.readlines()
    crackdata=cracked.readlines()
    for c in crackdata:
        for z in hashdata:
            if c.strip().split(':', 1)[0] in z:
                print('found: ', c.strip().split(':', 1))

基本上,我必须用匹配的行哈希替换在HASHES列表中找到的哈希:在CRACKED列表中找到plain。我正在迭代CRACKED,因为它每次都会更短。所以我的问题是上面的代码对于更长的列表来说非常慢。例如,处理具有60k行的两个文本文件最多需要15分钟。你有什么建议加快它的速度?

1 个答案:

答案 0 :(得分:4)

将其中一个文件存储在字典或集中;取出一个完整循环并且查找平均为O(1)常数时间。

例如,看起来crackdata文件可以很容易地转换为字典:

with open(CRACKED) as crackedfile:
    cracked = dict(map(str.strip, line.split(':')) for line in crackedfile if ':' in line)

现在你只需要遍历其他文件一次

with open(HASHES) as hashes:
    for line in hashes:
        hash = line.strip()
        if hash in cracked:
            print('Found:', hash, 'which maps to', cracked[hash])