在我目前的一个辅助项目中,我正在浏览一些文本,查看单词三元组的频率。在我的第一次尝试中,我使用了三层深度的默认字典。换句话说,topDict[word1][word2][word3]返回这些单词在文本中出现的次数,topDict[word1][word2]返回包含单词1和2之后出现的所有单词的字典,依此类推。
这可以正常运行,但它占用的内存非常多。在我最初的测试中,它使用的内存大约是在文本文件中存储三元组的内存的20倍,这似乎是一个过大的内存开销。
我怀疑许多这样的字典在创建时使用的插槽比实际使用的多得多,所以我想用其他方式使用时内存效率更高的东西来替换这些字典。我强烈倾向于一种解决方案,它允许沿着字典的行进行键查找。
根据我对数据结构的了解,使用红黑或AVL之类的平衡二进制搜索树可能是理想的,但我真的不愿意自己实现它们。如果可能的话,我更喜欢坚持使用标准的python库,但是如果其他的库工作得最好的话,我绝对愿意选择其他的库。
那么,有没有人对我有什么建议?
编辑后添加:
感谢你到目前为止的回复。到目前为止,有几个答案建议使用元组,当我将前两个单词压缩成一个元组时,元组对我来说并没有多大帮助。我不太愿意将这三个单词都用作关键字,因为我希望在给定前两个单词的情况下,能够轻松地查找所有第三个单词。(例如,我想要类似于topDict[word1, word2].keys()的结果)。
我正在使用的当前数据集是Wikipedia For Schools的最新版本。例如,对于一个文本文件,解析前1000页的结果类似于11MB,其中每行都是三个单词,count all制表符是分开的。在我现在使用的字典格式中存储文本大约需要185MB。我知道指针和诸如此类的东西会有一些额外的开销,但差异似乎太大了。
发布于 2008-11-29 16:52:46
您可以使用numpy多维数组。您需要使用数字而不是字符串来索引数组,但这可以通过使用单个字典将单词映射到数字来解决。
import numpy
w = {'word1':1, 'word2':2, 'word3':3, 'word4':4}
a = numpy.zeros( (4,4,4) )然后,要索引到您的数组中,您可以执行如下操作:
a[w[word1], w[word2], w[word3]] += 1这种语法并不美观,但是numpy数组的效率几乎和您能找到的任何数组一样高。还要注意的是,我还没有尝试过这段代码,所以我可能在一些细节上不太了解。只是凭着记忆在这里。
https://stackoverflow.com/questions/327223
复制相似问题