Python int字典与string字典以减小大小

Python int字典与string字典以减小大小,python,python-3.x,dictionary,size,Python,Python 3.x,Dictionary,Size,为了减少大型词典占用的内存空间,我将词典的结构从最初的{string:boolean}更改为{int:boolean}。令我惊讶的是,这本词典使用的记忆仍然是一样的: print(sys.getsizeof(myDictionary)) >140584 你能向我解释一下为什么使用int(大小为24字节)而不是字符串(至少60字节,可能更多是因为我的数据类型)无助于减少整个字典的大小吗?是因为两者都已链接到一个对象吗 以下是字典的计算方法: 对于{string:boolean}字典 m

为了减少大型词典占用的内存空间,我将词典的结构从最初的
{string:boolean}
更改为
{int:boolean}
。令我惊讶的是,这本词典使用的记忆仍然是一样的:

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

以下是字典的计算方法:

  • 对于
    {string:boolean}
    字典
myDictionary={feat:(项目特征列表中的feat)用于模型特征列表中的feat}

  • 对于
    {int:boolean}
    字典
myDictionary={int(i):(项目特征列表中的专长)对于专长,枚举(模型特征列表)中的i}


谢谢。

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


Python使用哈希函数来计算密钥的哈希值,哈希值始终是一个整数,用于索引内存中的密钥,因此占用相同的空间(这就是为什么我说的与密钥类型无关)。它不像
int
那样是4个字节,而
string
将占用
len(string)
字节空间。

sys.getsizeof
不会告诉您任何键和值的内存占用,只会告诉字典本身。它随条目的数量而变化,而不是条目的性质。Thx,我如何监控整个字典使用的内存呢?@MartijnPieters字典保留哈希,但必须保留密钥本身,以便在哈希匹配(冲突)时比较密钥,对吗?在这种情况下,一个整数可能比一个字符串小。@Jean-FrançoisFabre:散列的大小是固定的,
int
的散列值不小于
str
对象的散列值;它们都只是数据结构中的C整数。@Jean-Françoisfab这不是is的工作方式。Python使用“备份”算法来计算备用插槽。因此,如果插入时发生冲突,它将使用备份算法,直到找到空插槽。检索key.Thx时使用相同的过程,因此没有办法减小我的字典的大小?@ylor至少您不能通过更改键的类型来减小字典的大小。请注意,这与dict中的插槽数无关;OP希望sys.getsizeof()包含键和值的内存使用,因此将一种键类型替换为另一种键类型将导致内存减少。当然,整个Python堆的大小可以减小,但在
sys.getsizeof()
返回值中看不到这一点。@MartijnPieters我真的不认为,它会改变大小。字典以3位散列开始(这与使用的键的类型无关,只剩下散列值)。我不确定你的意思。你是说
{1:'foo'}
占用的内存与
{one':'foo'}
占用的内存一样多吗?两个dict的插槽数相同,
sys.getsizeof()
返回完全相同的内存大小。但那是因为这不包括
1
'one'
的大小。有关提供容器对象引用的内存总量的完整函数,请参见。