<p>当您创建一个空字典时,它会将内存分块预先分配给它可以存储的最初几个引用。随着字典添加更多的键值对,它需要更多的内存</p>
<p>但它不会随着每次添加而增长;每次需要更多的空间时,它都会添加一些内存块,这些内存块可以容纳“X”数量的键值对,一旦“X”数量被填满,另一块内存就会分配给字典</p>
<p>下面是一个<em>示例代码,用于显示随着键数的增加字典大小的变化</em>:</p>
<pre><code>import sys
my_dict = {}
print("Size with {} keys:\t {}".format(0, sys.getsizeof(my_dict)))
for i in range(21):
my_dict[i] = ''
print("Size with {} keys:\t {}".format(i+1, sys.getsizeof(my_dict)))
</code></pre>
<p>以下是Python 3.6.2中的输出:</p>
<pre><code>#same size for key count 0 - 5 : 240 Bytes
Size with 0 keys: 240
Size with 1 keys: 240
Size with 2 keys: 240
Size with 3 keys: 240
Size with 4 keys: 240
Size with 5 keys: 240
#same size for key count 6 - 10 : 360 Bytes
Size with 6 keys: 368
Size with 7 keys: 368
Size with 8 keys: 368
Size with 9 keys: 368
Size with 10 keys: 368
#same size for key count 11 - 20 : 648 Bytes
Size with 11 keys: 648
Size with 12 keys: 648
Size with 13 keys: 648
Size with 14 keys: 648
Size with 15 keys: 648
Size with 16 keys: 648
Size with 17 keys: 648
Size with 18 keys: 648
Size with 19 keys: 648
Size with 20 keys: 648
</code></pre>
<hr/>
<p>此外,dictionary只存储保存键和值的内存引用,而不将键值本身存储为<code>dict</code>对象的一部分。因此,数据的类型和大小都不会影响字典的<code>sys.getsizeof()</code>结果</p>
<p>例如,下面两个dict的大小都是280字节</p>
<pre><code>>>> sys.getsizeof({'a': 'a'})
280
>>> sys.getsizeof({'a'*100000: 'a'*1000000})
280
</code></pre>
<p>但是<code>'a'</code>V/s<code>'a' * 1000000</code>的大小之间存在差异:</p>
<pre><code>>>> sys.getsizeof('a')
38
>>> sys.getsizeof('a'*1000000)
1000037
</code></pre>