用字典替代双重循环实现快速查找

1、需求是比对两个文件然后将具有的相同行写入另一个文件(大概是这个意思);最直接的的做法肯定是双重循环分别遍历然后比较行是否相同,相同则写入,对于较小的文件还可以忍受,对于相对较大的几万甚至几十万的处理起来速度不可谓不慢,慢到难以忍受!然后如何实现快速查找呢,想到利用字典(速度快了不只几百倍啊!):其原理是先在字典的索引表里(比如部首表)查这个行对应的页码,然后直接翻到该页,找到这一行,无论找哪一行,这种查找速度都非常快,不会随着字典大小的增加而变慢。

2、具体实例代码(基于python)

import codecs
import os

#定义字典
dic=dict()
#根据文件一创建字典
img_full_path = '/home/ubuntu/handle1.txt'
ann_file = codecs.open(img_full_path, 'r', encoding='utf-8')
lines = ann_file.readlines()

q=open("./handle01.txt","w")
count=0
#按行创建字典(这里的一行中间有空格分成两部分)
for path in lines:
    image_text = path.strip('\n').split(' ')
    text_path = image_text[0]
    dic[text_path]=path #一行的第一部分作为键,整体一行作为值
    #print dic
#根据文件二查找字典
dir="/home/ubuntu/handle1"
for root, dirs, files in os.walk(dir):
    for name in files:
        if count%200==0:
            print count
        img_path=os.path.join(root,name)
        if dic.has_key(img_path):  #判断键是否存在,这里还有一种方法为 if img_path in dic.keys()
            q.write(dic.get(img_path))#写入文件三
            count+=1

3、效率对比:
因为这里处理的文件都是几十万行的,处理速度相差实在太大,就不在展示;

4、字典原理
dict内部存放的顺序和key放入的顺序是没有关系的。
查找和插入的速度极快,不会随着key的增加而增加;
需要占用大量的内存,内存浪费多。
dict是用空间来换取时间的一种方法。
dict的key必须是不可变对象。这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key;

总结:知道有这么个东西,但是当实际需求的时候却不一定立刻想得起来,还是欠思考、用的少啊!

猜你喜欢

转载自blog.csdn.net/Enjoy_endless/article/details/80569768