stardict是linux下使用最广的字段程序,在广大网友的贡献下,stardict的字典文件可是相当的丰富。pystardict是一个读取startdict字典文件的python库。
前些天在邮件列表看到有人提到用pystardict加载stardict的字典文件速度慢的问题。加载字段文件时需要解析字段的索引文件(.idx)取出所有的单词信息。但python未提供指针,处理速度远比不上c。
我尝试用正则表达式对索引解析部分的代码进行重写,经测试,速度应当能提高3/5的样子。感觉依旧不是太理想,不知道是否还有什么别的办法。
我将改动后的代码生成了一个patch发给pystardict的作者,不知道是否会被采用。
下面是idx解析的关键代码(idx的结构确实是非常的简单):
1 2 3 4 5 6 7 8 9 10 |
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 |
后记
今天收到原作者的邮件,我提交的patch已经接收了,新的pystardict已经更新过。不过他用的是我早些提交的patch。那个patch里,我unpack的时候没有做跳过\x00的处理,所以要稍微丑点。