检查foo的加载因子= {'foo':1,'zip':2,'zam':3,'bar':4}

时间:2018-10-22 00:50:43

标签: python

假设这样的关联数组,

foo = {'foo':1,'zip':2,'zam':3,'bar':4}

如何检查哈希表的加载因子?

2 个答案:

答案 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)除以容量!