LZ77压缩算法处理缓慢

时间:2013-02-04 06:31:28

标签: python compression

我正在使用LZ77压缩程序,当我尝试压缩116Kb文件时,处理时间太长。我的代码有什么问题吗?我怎样才能改善算法的处理时间?

import fileinput

class Assign:

    def pattern(self, data):

        self.skip = []

        self.m = len(data)
        for k in range(256): self.skip.append(self.m)

        for k in range(self.m - 1): self.skip[ord(data[k])] = self.m - k - 1

        self.skip = tuple(self.skip)

        self.data = data
    def find(self, text):
        n = len(text)
        if self.m > n: return -1
        k = self.m - 1
        while k < n:
            j = self.m - 1; i = k
            while j >= 0 and text[i] == self.data[j]:
                j -= 1; i -= 1
            if j == -1: return i + 1
            k += self.skip[ord(text[k])]
        return -1

class LZ77:

    def __init__(self, data):
        self.position = 0
        self.window = ""
        self.stream = data
        self.streamSize = len(self.stream)
        self.search = Assign()
    def Encode(self):
        p = 0
        c = ''
        lastresult = 0
        found = 0
        for i in range(self.streamSize):
            self.search.pattern(self.stream[self.position:self.position+i+1])
            result = self.search.find(self.window)
            if result < 0: break
            lastresult = result
            found = 1
        c = self.stream[self.position+i]
        p = lastresult
        B = 0
        if i > 0: B = self.position - p
        L = i
        if self.streamSize > 0:
            self.position += i + 1
            self.streamSize -= i + 1
            self.window = self.stream[:self.position]
        #print B,L,c
        return ((B, L), c)



    def Encoder(self):

        output = ""

        length = self.streamSize
        while self.streamSize > 0:
            ((B, L), C) = self.Encode()
            output += str(B) +   str(L) +  C
        return (output)

def aiyoo(#filename):

    enter = raw_input("enter the filename to which the original file is to be compressed to")
    enter1 = enter
    fob1 = open(enter,'wb')
    original = ''
    print filename
    #fob = open(filename,'rb')
    #numlines = 0
    """while True:
        c = fob.read(1)
        if not c:
            print "End of file"
            break
        else :"""
    for line in fileinput.input(['hello.txt']): #size of hello.txt is 116kb   
        original = line
        lz = LZ77(original)
        stream = lz.Encoder()#, streamSize = lz.Encoder()
        fob1.write(stream)
    """for i in fob:
        original = i
        lz = LZ77(original)
        stream = lz.Encoder()#, streamSize = lz.Encoder()
        fob1.write(stream)"""
    #fob.close()
    fob1.close()
    return enter

2 个答案:

答案 0 :(得分:0)

在提出这样的问题之前,您应该profile您的代码,找出哪个部分花费的时间最多。

但无论如何,我发现你已经实现了子串搜索功能。使用find string method代替应该显着提高速度。

另请注意,在Python中实现的压缩算法不会像在例如中那样快。 C,甚至没有关闭。

答案 1 :(得分:0)

真正的归档器(如zip和rar)中的lz77以下列方式工作:所有具有相同前3-4个字节的位置都插入到同一个散列桶中,然后我们只搜索这些条目中的最长匹配,通常将领域限制在8-32个位置