Python 字典底层实现的深度分析
2023-09-02 03:09:08
数据结构
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 字典会自动压缩表大小。压缩表大小操作会将已删除的键从哈希表中删除,并释放它们所占用的内存空间。