📜  Python字典的内部结构

📅  最后修改于: 2022-05-13 01:55:06.821000             🧑  作者: Mango

Python字典的内部结构

Python中的字典是数据值的无序集合,用于像映射一样存储数据值,与其他仅将单个值作为元素保存的数据类型不同,字典保存键:值对。字典中提供了key-value,使其更加优化

字典由许多桶组成。这些桶中的每一个都包含包含键值对的对象的哈希码。指向键对象的指针和指向值对象的指针。

下图展示了字典的内部结构:

字典以 8 个空桶开始。然后在达到其容量时通过将条目数量加倍来调整大小。这在 32 位机器上至少为 12 个字节,在 64 位机器上为 24 个字节

示例 1:一个空的Python字典占用 240 字节

Python3
# code
import sys
 
d = {}
print(sys.getsizeof(d))


Python3
# code
import sys
 
d = {}
d['python'] = 1
print(sys.getsizeof(d))


Python3
import sys
 
d = {}
d['a'] = 'a' * 100000
print("Size of dictionary ->", sys.getsizeof(d))
print("Size of a ->", sys.getsizeof('a'))


Python3
# code
import sys
 
d = {}
d['python'] = 1
for key in list(d.keys()):
  d.pop(key)
   
print(len(d))
print(sys.getsizeof(d))


Python3
import sys
 
d = {}
d['python'] = 1
for key in list(d.keys()):
  d.pop(key)
   
print(len(d))
d.clear()
print(sys.getsizeof(d))


输出:

240

例2 。我们第一次创建字典时,它只包含 8 个可以填充键值对的槽。

蟒蛇3

# code
import sys
 
d = {}
d['python'] = 1
print(sys.getsizeof(d))

输出:

240

正如您所看到的,在添加一些内容后,字典的大小仍然相同。字典存储在尚未满的桶中。

示例 3:

未存储在字典本身中的键值即使我们增加其值的大小,字典的大小也不会改变

蟒蛇3

import sys
 
d = {}
d['a'] = 'a' * 100000
print("Size of dictionary ->", sys.getsizeof(d))
print("Size of a ->", sys.getsizeof('a'))
输出
Size of dictionary -> 240
Size of a -> 50

输出:

Size of dicitonary -> 240
Size of a -> 50

示例 4:如果我们从字典中删除项目,字典的大小仍然相同。

蟒蛇3

# code
import sys
 
d = {}
d['python'] = 1
for key in list(d.keys()):
  d.pop(key)
   
print(len(d))
print(sys.getsizeof(d))

输出:

0
240

在这里,您可以看到字典尚未释放它分配的内存。它从哈希表中删除引用,但值在内存中。由于它没有被分配可能会成为垃圾收集的一部分。

示例 5:如果我们使用 clear 方法清空字典,它的大小比初始化的空字典小 72 个字节,即 240 个字节

蟒蛇3

import sys
 
d = {}
d['python'] = 1
for key in list(d.keys()):
  d.pop(key)
   
print(len(d))
d.clear()
print(sys.getsizeof(d))

输出:

0
72

这是因为该方法会清除内存。它还清除初始默认空间,即在字典中分配的 8 个桶。