输入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/