我试图减少从字符串压缩文件的时间,以及在我解压缩之后。 Dic是从Huffman算法获得的字典。压缩函数的输入是.txt,对于解压缩函数,输入文件是压缩函数的输出文件。
def compress(dic,archivo,outfile):
content = (open(archivo,'rt', encoding = 'utf-8')).read()
res = ''
for ch in content:
res = res + dic[ch]
outf = open(outfile,'wb')
pickle.dump(int('1'+ res,2),outf)
outf.close()
pass
def descompress(dic,infile,outfile):
data = bin(pickle.load(open(infile,'rb')))
k = 1
chain = ''
cadena = ''
for i in data:
if k>3:
chain = chain + i
if (chain in dic) == True:
cadena = cadena + dic[chain]
chain = ''
else:
k = k + 1
outfile = open(outfile,'w',encoding = 'utf-8')
outfile.write(cadena)
pass
好吧,我开始在函数descompress的代码中用k = 3读取,因为它以' 0b1'开头。这没什么。抱歉我的英语不好。
答案 0 :(得分:0)
您遇到的主要性能问题是字符串连接。例如:
chain = chain + i
分配临时字符串,将其分配给垃圾收集的旧chain
。非常低效。字符串未针对重新分配进行优化,因此+=
不会更快。
正确的方式:
list
的{{1}},并在循环中使用chain_list
。最后,只需chain_list.append(i)
chain = "".join(chain_list)
伪文件对象并在其中写入数据。最后,使用io.BytesIO
示例:
getcontents()
答案 1 :(得分:0)
列表理解可以节省大量时间:
res = ''.join(dic[ch] for ch in content)
并且您不需要将布尔语句与布尔值进行比较,if chain in dict:
就足够了。你也可以摆脱pass
,它在你的功能中是无用的。
最后,请使用with open(filename, mode) as name:
,这样每次打开时都不必输入filename.close()
。