我怎样才能减少时间?

时间:2016-10-30 12:23:01

标签: python string time huffman-code

我试图减少从字符串压缩文件的时间,以及在我解压缩之后。 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'开头。这没什么。抱歉我的英语不好。

2 个答案:

答案 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()