首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python字典的高效内存替代方案

Python字典的高效内存替代方案
EN

Stack Overflow用户
提问于 2008-11-29 13:33:27
回答 12查看 21.1K关注 0票数 46

在我目前的一个辅助项目中,我正在浏览一些文本,查看单词三元组的频率。在我的第一次尝试中,我使用了三层深度的默认字典。换句话说,topDict[word1][word2][word3]返回这些单词在文本中出现的次数,topDict[word1][word2]返回包含单词1和2之后出现的所有单词的字典,依此类推。

这可以正常运行,但它占用的内存非常多。在我最初的测试中,它使用的内存大约是在文本文件中存储三元组的内存的20倍,这似乎是一个过大的内存开销。

我怀疑许多这样的字典在创建时使用的插槽比实际使用的多得多,所以我想用其他方式使用时内存效率更高的东西来替换这些字典。我强烈倾向于一种解决方案,它允许沿着字典的行进行键查找。

根据我对数据结构的了解,使用红黑或AVL之类的平衡二进制搜索树可能是理想的,但我真的不愿意自己实现它们。如果可能的话,我更喜欢坚持使用标准的python库,但是如果其他的库工作得最好的话,我绝对愿意选择其他的库。

那么,有没有人对我有什么建议?

编辑后添加:

感谢你到目前为止的回复。到目前为止,有几个答案建议使用元组,当我将前两个单词压缩成一个元组时,元组对我来说并没有多大帮助。我不太愿意将这三个单词都用作关键字,因为我希望在给定前两个单词的情况下,能够轻松地查找所有第三个单词。(例如,我想要类似于topDict[word1, word2].keys()的结果)。

我正在使用的当前数据集是Wikipedia For Schools的最新版本。例如,对于一个文本文件,解析前1000页的结果类似于11MB,其中每行都是三个单词,count all制表符是分开的。在我现在使用的字典格式中存储文本大约需要185MB。我知道指针和诸如此类的东西会有一些额外的开销,但差异似乎太大了。

EN

Stack Overflow用户

发布于 2008-11-29 16:52:46

您可以使用numpy多维数组。您需要使用数字而不是字符串来索引数组,但这可以通过使用单个字典将单词映射到数字来解决。

代码语言:javascript
运行
复制
import numpy
w = {'word1':1, 'word2':2, 'word3':3, 'word4':4}
a = numpy.zeros( (4,4,4) )

然后,要索引到您的数组中,您可以执行如下操作:

代码语言:javascript
运行
复制
a[w[word1], w[word2], w[word3]] += 1

这种语法并不美观,但是numpy数组的效率几乎和您能找到的任何数组一样高。还要注意的是,我还没有尝试过这段代码,所以我可能在一些细节上不太了解。只是凭着记忆在这里。

票数 0
EN
查看全部 12 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/327223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档