Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在大字符串上迭代并检查子字符串在字典中的成员身份_Python_String_Performance - Fatal编程技术网

Python 在大字符串上迭代并检查子字符串在字典中的成员身份

Python 在大字符串上迭代并检查子字符串在字典中的成员身份,python,string,performance,Python,String,Performance,我目前正在用python实现Huffman编码,我已经完成了,但我想让它更高效 这是我用来获取原始文件内容的方法 def getDecodedFile(self, text, codes): code = "" origin = [] for ch in text: code += ch if code in codes: origin.append(c

我目前正在用python实现Huffman编码,我已经完成了,但我想让它更高效

这是我用来获取原始文件内容的方法

def getDecodedFile(self, text, codes):
        code = ""
        origin = []        
        for ch in text:
            code += ch
            if code in codes:
                origin.append(codes[code])
                code = ""
        bCodes = bytes(origin)
        return bCodes
text
是大字符串,
code
是哈夫曼代码字典(Key是代码字符串,value是0到255之间的整数)

我尝试使用
'.join(somelist)
而不是
code+=ch
,但结果要慢得多。目前,使用
len(text)=13972363执行此方法需要3秒钟,最短的代码长度为
6

数据示例:

text=“0100101110111”

code={'0':65'100':66'101':67'110':68'111':69}

这将导致
origin=[65,66,67,68,69]


如果您能给我一些建议,让我的代码更有效率,我将不胜感激。

据我所知,您可以做的一个改进就是这样做:

code += ch
if code in codes:
    origin.append(codes[code])
code = ""
具体来说,每次修改
code
时,都要检查
if-code-in-code:
。例如,对于长度为k的代码,您将在此处执行O(1+2+3+…+k)=O(0.5*k*k+1)=O(k²)操作。相反,您应该预处理
代码
,方法是构建一棵哈夫曼树,并沿树向下进行一次O(k)遍历以解码代码(从根开始,每次读取一个1或0,然后沿着相应的子边缘;一旦您碰到一个字母,在解码的消息中输出它,然后移回树的根)。这不仅显式地节省了检查
if code in code:
的时间复杂性,而且还避免了每次执行
code+=ch
时重新生成字符串
code


除此之外,我不确定您是否可以进一步优化。我想知道将每个解码的字母转换为
字节并附加到输出列表是否比将字母解码为列表然后通过
字节(源代码)转换列表更快?

据我所知,您可以做的一个改进是:

code += ch
if code in codes:
    origin.append(codes[code])
code = ""
具体来说,每次修改
code
时,都要检查
if-code-in-code:
。例如,对于长度为k的代码,您将在此处执行O(1+2+3+…+k)=O(0.5*k*k+1)=O(k²)操作。相反,您应该预处理
代码
,方法是构建一棵哈夫曼树,并沿树向下进行一次O(k)遍历以解码代码(从根开始,每次读取一个1或0,然后沿着相应的子边缘;一旦您碰到一个字母,在解码的消息中输出它,然后移回树的根)。这不仅显式地节省了检查
if code in code:
的时间复杂性,而且还避免了每次执行
code+=ch
时重新生成字符串
code


除此之外,我不确定您是否可以进一步优化。我想知道将每个解码的字母转换为
字节并附加到输出列表是否会比将字母解码为列表然后通过
字节(源代码)转换列表更快?

最大的性能提升来自使用trie之类的工具来存储哈夫曼树。这将允许您一次降低一个级别,这将消除字符串连接或重复检查状态的需要。

最大的性能提升将来自使用trie之类的工具来存储Huffman树。这将使您一次降低一个级别,这将消除字符串连接或重复检查是否存在的需要。

我所做的是使用树来解码代码,而不是使用字典,这节省了大约0.5秒,但将每个字母转换为字节实际上会减慢速度,因此我保留了我的列表。谢谢没问题!不幸的是,据我所知,这是在算法实现方面实现哈夫曼解码的最快方法。任何进一步的优化都是低级的事情(例如,将树存储为一个数组,以最大限度地降低内存访问速度,使用更快的语言编写,等等)使用Py3而不是默认解释器,同一个文件的时间下降到了0.6秒。我所做的是使用树来解码代码,而不是使用字典,这节省了大约0.5秒,但将每个字母转换为字节实际上会减慢速度,所以我保留了我的列表。谢谢没问题!不幸的是,据我所知,这是在算法实现方面实现哈夫曼解码的最快方法。任何进一步的优化都是低级的事情(例如,将树存储为一个数组以最小化内存访问速度、使用更快的语言写入等)。使用Py3而不是默认解释器,同一文件的时间下降到0.6秒。