【问题标题】:Dictionary of int vs dictionary of string to reduce size [duplicate]int字典与字符串字典以减小大小[重复]
【发布时间】:2017-03-01 14:02:21
【问题描述】:

为了减少大型字典占用的内存空间,我将字典的结构从最初的 {string: boolean} 更改为 {int: boolean}。令我惊讶的是,字典使用的内存保持不变:

print(sys.getsizeof(myDictionary))
>140584

您能否向我解释一下为什么使用 int(大小为 24 字节)而不是字符串(至少 60 字节,由于我的数据类型可能更多)无助于减小整个字典的大小?是因为两者都已经链接到一个对象吗?

以下是字典的计算方式:

  • 用于{string: boolean} 字典

myDictionary ={feat:(feat in item_feature_list) for feat in model_features_list}

  • 用于{int: boolean} 字典

myDictionary = {int(i):(feat in item_feature_list) for feat, i in enumerate (model_features_list)}

谢谢。

【问题讨论】:

  • sys.getsizeof 不会告诉您任何有关键和值的内存占用的信息,只告诉您字典本身。它随条目的数量而变化,而不是条目的性质。
  • Thx,那我如何监控整个字典使用的内存呢?
  • @MartijnPieters 字典保留散列,但必须保留键本身以在散列匹配(冲突)时比较键,对吗?在这种情况下,整数可能小于字符串。
  • @Jean-FrançoisFabre:哈希有固定大小,int 的哈希不小于str 对象的哈希;它们都是数据结构中的 C 整数。
  • @Jean-FrançoisFabre 这不是工作方式。 Python 使用“备份”算法来计算备用槽。因此,如果在插入时发生冲突,它会使用备份算法,直到找到空槽。检索密钥时使用相同的过程。

标签: python python-3.x dictionary size


【解决方案1】:

字典的大小与所使用的键的类型无关。无论您使用string 还是int,python 都会为键分配相同的空间。它将hash 函数应用于键并获取计算的哈希值的最后3 位 作为键(该值随着字典大小的增长而增长以避免冲突)。

Python 使用散列函数来计算键的散列值,它始终是一个整数,索引内存中的键,因此占用相同的空间(这就是我说与键类型无关的原因)。它不像 int 将是 4 个字节,而 string 将占用 len(string) 字节空间。

【讨论】:

  • 谢谢,所以没有办法减小我的字典的大小?
  • @ylnor 至少你不能通过改变键的类型来减小大小。
  • 请注意,这与dict中的槽数无关; OP 期望 sys.getsizeof() 包含键和值的内存使用,因此将一种键类型换成另一种键类型会导致内存减少。当然,可以减小整体 Python 堆大小,只是您不会在 sys.getsizeof() 返回值中看到这一点。
  • @MartijnPieters 我真的不认为,它会改变大小。字典以 3 位散列开头(这与所用键的 type 无关,唯一剩下的就是那个散列值)。
  • 我不确定你的意思。你是说{1: 'foo'} 占用的内存与{'one': 'foo'} 一样多吗?两个 dict 具有相同数量的插槽,sys.getsizeof() 返回完全相同的内存大小。但那是因为这不包括1'one' 的大小。请参阅code.activestate.com/recipes/577504 以获得一个完整的函数,该函数为您提供容器对象引用的内存总量。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多