Python中集合的内部负载因子是多少

use*_*552 3 python dictionary set load-factor

我试图找出 Python 集的内部负载因子是多少。对于使用负载因子为 0.66 (2/3) 的哈希表的字典来说。存储桶的数量从 8 开始,当插入第 6 个键时,存储桶的数量增加到 16 下表显示了存储桶的变化。

转移
8 5
16 10
32 21
64 42
128 85

这可以通过以下 Python 代码看出,其中字典和集合的大小通过 getsizeof 方法显示:

import sys
d = {}
s = set()

for x in range(25):
    d[x] = 1
    s.add(x)
    print(len(d), sys.getsizeof(d), sys.getsizeof(s))

Run Code Online (Sandbox Code Playgroud)
元素数量 用于字典的内存 用于集合的内存
1 第232章 216
2 第232章 216
3 第232章 216
4 第232章 216
5 第232章 728
6 360 728
7 360 728
8 360 728
9 360 728
10 360 728
11 640 728
12 640 728
13 640 728
14 640 728
15 640 728
16 640 728
17 号 640 728
18 640 728
19 640 2264
20 640 2264
21 640 2264
22 第1176章 2264
23 第1176章 2264
24 第1176章 2264
25 第1176章 2264

上表显示桶中的移位正确的是针对字典的,而不是针对集合的。集合中的记忆是不同的。

我试图找出一组的负载系数是多少。这也是2/3吗?或者我的代码做错了什么?

use*_*ica 5

目前,大约是3/5。查看来源

if ((size_t)so->fill*5 < mask*3)
    return 0;
return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
Run Code Online (Sandbox Code Playgroud)

fill是占用的表单元格数(包括“已删除条目”标记),并且mask比表总容量减 1。

  • @flakes:当然。CPython [已更改](https://github.com/python/cpython/commit/5cd87a8d61246b0a6233bfb8503d4718b693cef0) 从 2017 年的 2/3 开始。我不知道 Pypy 或 Jython 做什么,但它们不受 CPython 实现的约束决定。 (3认同)