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

两个列表,在python中比较更快,python,performance,python-2.7,comparison,Python,Performance,Python 2.7,Comparison,我正在编写python(2.7)脚本来比较两个列表。这些列表是通过读取文件内容从文件中创建的。文件只是文本文件,没有二进制文件。文件1只包含散列(一些纯文本字的MD5和),文件2是散列:普通。列表有不同的长度(逻辑上,我可以有比散列更少的“破解”条目),并且两者都不能排序,因为我必须保持顺序,但这是我试图实现的下一步。到目前为止,我的简单代码如下所示: #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os def

我正在编写python(2.7)脚本来比较两个列表。这些列表是通过读取文件内容从文件中创建的。文件只是文本文件,没有二进制文件。文件1只包含散列(一些纯文本字的MD5和),文件2是散列:普通。列表有不同的长度(逻辑上,我可以有比散列更少的“破解”条目),并且两者都不能排序,因为我必须保持顺序,但这是我试图实现的下一步。到目前为止,我的简单代码如下所示:

#!/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))
#/usr/bin/env python
#-*-编码:utf-8-*-
导入系统
导入操作系统
def ifexists(fname):
如果不是os.path.isfile(fname):
打印('[-]%s必须存在“%fname”)
系统出口(1)
如果len(系统argv)<2:
打印('[-]请提供破解和哈希文件')
系统出口(1)
破解=系统argv[1]
HASHES=sys.argv[2]
sk_(裂纹)
sk_ifexists(散列)
将open(CRACKED)作为CRACKED,open(hash)作为hash:
hashdata=hashes.readlines()
crackdata=cracked.readlines()
对于数据中的c:
对于hashdata中的z:
如果c.strip().split(“:”,1)[0]在z:
打印('found:',c.strip().split(':',1))

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

将这些文件中的一个存储在字典或集合中;这需要一个完整的循环,平均查找时间为O(1)个常数

例如,
crackdata
文件可以轻松转换为字典:

with open(CRACKED) as crackedfile:
    cracked = dict(map(str.strip, line.split(':')) for line in crackedfile if ':' in line)
现在您只需在另一个文件上循环一次:


c.strip().split(“:”,1)[0]
拉到一个集合中,然后散列到另一个集合中,并查找两个集合的交集,这很好。现在完成整个操作(60k条记录)大约需要1s。非常感谢。
with open(HASHES) as hashes:
    for line in hashes:
        hash = line.strip()
        if hash in cracked:
            print('Found:', hash, 'which maps to', cracked[hash])