擅长:python、mysql、java
<p>Python int在内部表示为C long(实际上比这复杂一些),但这并不是问题的根源。在</p>
<p>最大的开销是你使用dicts。(defaultdict和dicts在本说明中大致相同)。dict是使用哈希表实现的,这很好,因为它可以快速查找非常一般的键。(当您只需要查找连续的数字键时,就没有必要了,因为它们可以以一种简单的方式进行布局以获得它们。)</p>
<p>一个dict可以有比它的项目更多的槽。假设你有一个dict,它的槽数是物品的3倍。每个插槽都需要一个指向键的指针和一个用作链表末尾的指针。这是数字的6倍,加上所有你感兴趣的项目的指针。考虑到系统上的每个指针都是8字节,在这种情况下有16384个defaultdict。粗略地看一下这个,<code>16384 occurrences * (8192 items/occurance) * 7 (pointers/item) * 8 (bytes/pointer) = 7 GB</code>。这是在我得到存储的实际数字之前(每个唯一的数字本身就是一个Python dict)、外部dict、numpy数组,或者Python为了优化一些而跟踪的内容。在</p>
<p>您的开销听起来比我猜想的要高一点,我很想知道11GB是用于整个进程还是仅为表计算的。无论如何,我确实希望这个dict of defaultdicts数据结构的大小比numpy数组表示大几个数量级。在</p>
<p>至于“有没有办法避免这些费用?”答案是“使用numpy存储大型、固定大小的连续数字数组,而不是dicts!”你必须更加具体和具体地解释为什么你认为这样的结构是必要的,以便更好地建议什么是最好的解决方案。在</p>