python 集合对象 底层实现 源码分析 PySetObject(set)

PySetObject

本文参考的是 3.8.0a0 版本的代码,详见  cpython 源码分析 基本篇

以后都在 github 更新,请参考 图解 python set

 

set 的实现方式和 dict 有点类似,但是稍微简单一些,我们来看看 set 的 memory layout

我们来看下 set_lookkey 这个函数

/* Objects/setobject.c
   57 - 133 行
*/

static setentry *
set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
{
    /* 给定一个 key, 和一个 hash 值,返回这个 hash 在这个集合 so 里对应的 entry */
    setentry *table;
    setentry *entry;
    size_t perturb;
    size_t mask = so->mask;
    size_t i = (size_t)hash & mask; /* 把 hash 高于 mask 长度的位清零,留下长度低于 mask 位数 */
    size_t j;
    int cmp;

    entry = &so->table[i]; /* 取出集合的第 i 个 entry */
    if (entry->key == NULL) /* 如果第 i 个 entry 是空的值,直接返回 */
        return entry;

    perturb = hash;

    while (1) {
        /* 第i个 entry 不为空, 开始循环匹配,直到找到相等的 entry 为止 */
        if (entry->hash == hash) {
            /* 如果 entry 里的 hash 值相同,判断 key 是否相同 */
            PyObject *startkey = entry->key;
            /* startkey cannot be a dummy because the dummy hash field is -1 */
            assert(startkey != dummy);
            if (startkey == key) /*
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值