输入t1
P95P,71655,LINC-JP,致病性
P95P,71655,LINC-JP,致病性
P71P,71655,LINC-JP,致病性
P71P,71655,LINC-JP,致病性
输出操作
P95P,71655,LINC-JP,致病性
P71P,71655,LINC-JP,致病性
霉菌

def dup():
    fi=open("op","a")
    l=[];final="";
    q=[];dic={};
    for i in open("t1"):
        k=i.split(",")
        q.append(k[1])
        q.append(k[0])
        if q in l:
            pass
        else:
            final= final + i.strip() + "\n"
            fi.write(str(i.strip()))
            fi.write("\n")
        l.append(q)
        q=[]
        #print i.strip()
    fi.close()
    return final.strip()
d=dup()

在上面的输入行1,2和3,4是重复的。因此,在输出中,这些重复项被删除,输入文件中的条目约为10^7。
为什么我的代码在过去24小时内运行,输入76Mb的文件。而且它还没有完成整个输入文件的一次迭代,对于小文件来说效果很好。
有人能指出这么长时间的原因吗?我怎样才能优化我的程序?泰恩克斯

最佳答案

现在还不清楚为什么要构建一个巨大的字符串(final)来保存文件所做的相同事情,或者dic用于什么。在性能方面,如果x in y是ay则可以比set是ay更快地查找list。另外,还有一点;较短的变量名不会提高性能,因此请使用好的变量名。我建议:

def deduplicate(infile, outfile):
    seen = set()
    #final = []
    with open(outfile, "a") as out, open(infile) as in_:
        for line in in_:
            check = tuple(line.split(",")[:2])
            if check not in seen:
                #final.append(line.strip())
                out.write(line) # why 'strip' the '\n' then 'write' a new one?
                seen.add(check)
    #return "\n".join(final)

如果您真的需要final,请将它列成一个列表,直到最后一刻(请参见注释行)-逐步的字符串连接意味着创建了许多不必要的对象。

关于python - 用于删除重复项的python脚本,耗时24小时以上才能遍历10 ^ 7条记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24432319/

10-08 22:47