python – 内存效率:一个大字典或较小字典的字典?

我在Python(2.6)中编写一个应用程序,需要使用字典作为数据存储。

我很好奇是否有更大的内存效率具有一个大字典,或将其分解成许多(很多)较小的字典,然后有一个“索引”字典包含对所有较小的字典的引用。

我知道有很多开销一般与列表和字典。我读某处python内部分配足够的空间,字典/列表项目的2的力量。

我新的足够python,我不知道是否有其他意想不到的内部复杂性/这样的惊喜,这是不明显的普通用户,我应该考虑。

其中的一个困难是知道2系统的权力如何计数“项目”?每个键:对是否计为1项?这似乎很重要的知道,因为如果你有一个100项单片词典,然后空间100 ^ 2项将被分配。如果你有100个单项词典(1键:对),那么每个字典只会分配1 ^ 2(aka没有额外的分配)?

任何清楚布局的信息将是非常有益的!

三个建议:

>使用一个字典。
它更容易,更直接,而有人已经为你优化了这个问题。直到你实际测量你的代码,并追溯到这部分的性能问题,你没有理由不做简单,直接的事情。
>稍后优化。
如果你真的担心性能,那么抽象问题使一个类包装任何你最终使用的查找机制,并编写你的代码来使用这个类。如果您发现需要一些其他数据结构以获得更高的性能,您可以稍后更改实现。
>在哈希表上读取。
字典是hash tables,如果你担心他们的时间或空间开销,你应该了解如何实现。这是基本的计算机科学。缺点是哈希表是:

>平均情况O(1)查找时间
> O(n)空间(期望约2n,取决于各种参数)

我不知道你在哪里读他们是O(n ^ 2)空间,但如果他们是,那么他们不会广泛,实际使用,因为他们在今天的大多数语言。哈希表的这些好的属性有两个优点:

> O(1)查找时间意味着你不会在查找时间为一个更大的字典支付成本,因为查找时间不依赖于大小。
> O(n)空间意味着你不会从打破字典到更小的部分获得任何东西。空间与元素的数量线性地缩放,因此许多小字典不会占用比一个大的字典少得多的空间,反之亦然。这不会是真的,如果他们是O(n ^ 2)空间,但幸运的你,他们不是。

以下是一些可能有用的资源:

> Wikipedia article on Hash Tables给出了哈希表中使用的各种查找和分配方案的列表。
> GNU Scheme documentation有一个很好的讨论,你可以期望hashtables占用多少空间,包括一个正式讨论为什么“哈希表使用的空间量与表中的关联数成正比”。这可能会让你感兴趣。

这里有一些事情,你可能会考虑,如果你发现你实际需要优化字典实现:

>这里是Python的字典的C源代码,万一你想要所有的细节。这里有大量的文档:

> dictobject.h
> dicobject.c

>这里是一个python implementation,如果你不喜欢阅读C.
(感谢Ben Peterson)
> Java Hashtable class docs谈论一点有关负载因素如何工作,以及它们如何影响您的散列占用的空间。请注意,您的负载系数和您需要重新哈希的频率之间需要权衡。重新设置可能是昂贵的。

http://stackoverflow.com/questions/671403/memory-efficiency-one-large-dictionary-or-a-dictionary-of-smaller-dictionaries

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:python – 内存效率:一个大字典或较小字典的字典?