任务是合并两个大的已排序文件。它们无法融入记忆中。我的想法是分别从第1行和第2行逐行读取行,然后比较它们以决定将哪一行放在目标文件中。
文件1:
啤酒
焦炭
红牛
文件2:
干酪汉堡包
三明治
玉米面豆卷
输出文件应为:
啤酒
干酪汉堡包
焦炭
红牛
三明治
玉米面豆卷
我已将这个想法实现如下:
def read_non_empty_line(input):
while True:
line = input.readline()
if line == "": #end of the file
return ""
if line.isspace() == False:
return line.strip()
def combine_sorted_files(file1, file2, output):
read_file1, read_file2 = True, True
with open(output,'w') as output_file:
with open(file1,'r') as input_file1:
with open(file2,'r') as input_file2:
while True:
if read_file1:
line1 = read_non_empty_line(input_file1) #read one line, skip empty line
if read_file2:
line2 = read_non_empty_line(input_file2) #read one line, skip empty line
if line1 == "" or line2 == "": #end of the file
break
read_file1, read_file2 = False, False
if line1 < line2:
smaller = line1
read_file1 = True
else:
smaller = line2
read_file2 = True
output_file.write(smaller+"\n\n")
while line1 != "": # continue on file1 if necessary
output_file.write(line1+"\n\n")
line1 = read_non_empty_line(input_file1)
while line2 != "": # continue on file2 if necessary
output_file.write(line2+"\n\n")
line2 = read_non_empty_line(input_file2)
问题是我的实施很慢。有什么想法加快这个任务吗?
答案 0 :(得分:0)
由于您说您的文件非常大,您可以删除字符串连接。
而不是:
output_file.write(smaller+"\n\n")
您可以用以下内容替换所有示例:
output_file.write(smaller)
output_file.write("\n\n")
这将阻止python从将smaller
和"\n\n"
添加到一起的结果中创建新字符串,并且会更快。虽然它可能不明显:)
不要忘记字符串在python中是不可变的,并且使用+
操作并不是简单地将换行符添加到字符串中。首先,它必须在将新字符串的结果传递给函数之前创建一个完整的新字符串。