标签归档:python

提升pystardict对stardict字典文件的加载速度

stardict是linux下使用最广的字段程序,在广大网友的贡献下,stardict的字典文件可是相当的丰富。pystardict是一个读取startdict字典文件的python库。
前些天在邮件列表看到有人提到用pystardict加载stardict的字典文件速度慢的问题。加载字段文件时需要解析字段的索引文件(.idx)取出所有的单词信息。但python未提供指针,处理速度远比不上c。
我尝试用正则表达式对索引解析部分的代码进行重写,经测试,速度应当能提高3/5的样子。感觉依旧不是太理想,不知道是否还有什么别的办法。
我将改动后的代码生成了一个patch发给pystardict的作者,不知道是否会被采用。
下面是idx解析的关键代码(idx的结构确实是非常的简单):

        import re
        rawstr = r"""([\d\D]+?\x00[\d\D]{8})"""
        matchstr = self._file
        match_obj = re.findall(rawstr, matchstr)
        for e in match_obj:
            c = e.find('\x00')
            record_tuple = unpack('!%sc1x%sL' % (c, idx_offset_format), e)
            word, cords = ''.join(record_tuple[:c]), record_tuple[c:]
            self._idx[word] = cords

附件:提高了字典加载速度的pystardict

后记

今天收到原作者的邮件,我提交的patch已经接收了,新的pystardict已经更新过。不过他用的是我早些提交的patch。那个patch里,我unpack的时候没有做跳过\x00的处理,所以要稍微丑点。