返回

Python 字典底层实现的深度分析

后端

数据结构
Python 字典采用哈希表的数据结构来存储键值对。哈希表是一种非常高效的数据结构,它允许您通过键快速查找值。

算法

Python 字典使用哈希算法来计算键的哈希值。哈希值是一个唯一的数字,它可以用来确定键在哈希表中的位置。

性能优化

为了提高 Python 字典的性能,Python 解释器采用了多种优化技术,例如:

  • 使用分段表来减少哈希冲突。
  • 使用缓冲池来减少内存分配的开销。
  • 使用删除标记来避免内存碎片。

源码分析

Python 字典的底层实现非常复杂,涉及到很多数据结构和算法。您可以在 Python 源代码中找到 Python 字典的底层实现代码。

相关位置文件

Python 字典的底层实现代码主要位于以下几个文件中:

  • Objects/dict.c
  • Objects/dictobject.c
  • Include/dictobject.h

演变和实现

Python 字典的底层实现经历了多次演变。在早期版本的 Python 中,Python 字典使用链表来存储键值对。后来,Python 解释器采用了哈希表来实现 Python 字典,这大大提高了 Python 字典的性能。

内存构造

Python 字典在内存中以以下结构存储:

struct dict {
    PyObject *me_keytable;    /* Table of keys */
    PyObject *me_valuetable;  /* Table of values */
    Py_ssize_t me_used;       /* Number of items in the table */
    Py_ssize_t me_allocated;  /* Table size (in entries) */
    PyObject *me_zombietable; /* List of dead items */
    PyObject *me_zombievalue; /* List of dead values */
};

Combined Table 和 Split Table

Python 字典可以使用两种不同的表来存储键值对:

  • Combined Table:一种表同时存储键和值。
  • Split Table:两种表,一种表存储键,一种表存储值。

Indices 数组

Python 字典使用 indices 数组来存储哈希值。indices 数组是一个整型数组,它的大小等于 Python 字典的表大小。

Entries 哈希碰撞与删除

当两个键的哈希值相同时,就会发生哈希碰撞。Python 字典使用链表来解决哈希碰撞。当一个键发生哈希碰撞时,Python 字典会将该键添加到链表中。

当一个键被删除时,Python 字典不会立即从哈希表中删除该键。相反,Python 字典会将该键标记为已删除。已删除的键不会参与哈希查找,但是它们仍然占据着哈希表中的空间。

表扩展

当 Python 字典的表大小达到最大值时,Python 字典会自动扩展表大小。表扩展操作会创建一个新的表,并将旧表中的键值对复制到新表中。

缓冲池

Python 字典使用缓冲池来减少内存分配的开销。缓冲池是一个内存池,它存储着可以重用的内存块。当 Python 字典需要分配内存时,它会首先从缓冲池中分配内存。

删除操作

当一个键被删除时,Python 字典不会立即从哈希表中删除该键。相反,Python 字典会将该键标记为已删除。已删除的键不会参与哈希查找,但是它们仍然占据着哈希表中的空间。

当 Python 字典的表大小达到最大值时,Python 字典会自动压缩表大小。压缩表大小操作会将已删除的键从哈希表中删除,并释放它们所占用的内存空间。