假设这样的关联数组,
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
如何检查哈希表的加载因子?
答案 0 :(得分:1)
负载系数=项目总数/哈希表大小。据我所知,cpython 3.6 dict is 8中的最小表大小不超过5个活动条目
答案 1 :(得分:0)
虽然公式取决于(C)Python版本和指针大小(有时甚至取决于键的类型!),但是您可以使用sys.getsizeof()
来进行度量。后面的确切数字适用于64位版本。
在Python中, 2 非常简单:PyDictObject
(其容量始终为8)及其PyGC_Head
为280B,因此容量为
def cap2(d): return (sys.getsizeof(d)-280)/24 or 8
此版本中的词典增长了三倍,如果很大,则增长一倍。
在3.6之前的Python 3 中,固定开销为96B(用于在类实例之间共享属性名称的所谓“拆分表”除外),所以它是
def cap3(d): return (sys.getsizeof(d)-96)//24
字典(3.5版)通过翻倍(没有删除时)增长。
自 3.6 起,开销为112B。进一步的存储更加复杂,因为实际的哈希表仅存储索引并且它们的大小可变。然后,我们必须对USABLE_FRACTION
中的dictobject.c
使用公式,并计算出表容量为2 ^ n ( n > = 3)是
112+(1<<n)*(n//8+1)+(1<<n+1)//3*24
这很难准确地反转,但是(鉴于这些严格的假设),您可以将其近似为2的最大幂,但不大于大小的十七分之一!!
def cap36(d):
s=sys.getsizeof(d)//17
n=3
while 1<<n+1<=s: n+=1
return n
不要忘记将len(d)
除以容量!