先介绍问题描述:
已有两个文件a.dat和b.dat,每个文件都包含若干行句子,现在需要你编写python程序,来找到两个文件中相同的句子,完成:
1 将相同的句子打印到common.dat文件中,每行一句
2 在控制台打印出程序执行的时长,和相同句子的数量
算法1:
采用循环查找方法,运行结果为:总共2500个重复的句子,运行总时长:118.077s;
代码如下:
import time
fileA = ‘/***/f1.dat’
fileB = ‘/***/f2.dat’
fileC = ‘/***/common2.dat’
def findSameSents(file1, file2, file3):
f1 = open(file1, 'r')
fa = f1.readlines()
f1.close()
f2 = open(file2, 'r')
fb = f2.readlines()
f2.close()
f3 = open(file3, 'wb')
time1 = time.time()
count = 0
fc = [i for i in fa if i in fb]
f3.writelines(fc)
print len(fc)
time2 = time.time()
time3 = time2 - time1
f3.close()
print time3
if __name__ == '__main__':
findSameSents(fileA, fileB, fileC)
算法2:采用集合set,分别将两个文件读入集合,求两个集合的交集,并将交集写入文件common。交集的长度即为所求个数。运行结果:重复句子2500个,运行失常大大缩减至最快190ms。
代码如下:
import time
fileA = '/***/data/f1.dat'
fileB = '/***/data/f2.dat'
fileC = '/***/data/common3.dat'
def findSameSents(file1, file2, file3):
f1 = open(file1, 'r')
str1 = []
str2 = []
for line in f1.readlines():
str1.append(line.replace('\n', ''))
set1 = set(str1)
f1.close()
f2 = open(file2, 'r')
for line in f2.readlines():
str2.append(line.replace('\n', ''))
set2 = set(str2)
f2.close()
set3 = set1 & set2
print len(set3)
f3 = open(file3, 'wb')
for i in set3:
f3.write(i)
f3.close()
if __name__ == '__main__':
time1 = time.time()
findSameSents(fileA, fileB, fileC)
time2 = time.time()
print time2 - time1
算法3:在算法2的基础上,对读取文件数据的处理方式进一步改进,下面是改进后的代码,改进后运行时间仅一步缩短至100ms左右。
def findSameSents(file1, file2, file3):
set1 = set()
set2 = set()
with open(file1, 'r') as f1:
for l in f1:
set1.add(l)
with open(file2, 'r') as f2:
for l in f2:
set2.add(l)
set3 = set1 & set2
print len(set3)
with open(file3, 'wb') as f3:
for i in set3:
f3.write(i)
其中,关于算法2中的f3.write(i)语句,为什么没有加入换行符,即f3.wriye(i + ‘\n’)就可以在写入的文件中自动换行的问题?通过单步调试,得出如下原因,如下图所示。
是因为,原来文件中每行语句的末尾都包含有一个回车符\r和一个写入的语句i里面,而我刚开始在算法2里面,只是替换了其中的换行符\n,并没有对回车符\r进行变换,所以写入文件的时候被行末的\r自动换行了。