sys.getsizeof()结果与结构大小不太相关

sys.getsizeof()结果与结构大小不太相关,第1张

sys.getsizeof()结果与结构大小不太相关

如果检查列表的大小,它将提供列表数据结构的大小,包括指向其组成元素的指针。它不会考虑元素的大小。

str1_size = sys.getsizeof(['a' for i in xrange(0, 1024)])str2_size = sys.getsizeof(['abc' for i in xrange(0, 1024)])int_size = sys.getsizeof([123 for i in xrange(0, 1024)])none_size = sys.getsizeof([None for i in xrange(0, 1024)])str1_size == str2_size == int_size == none_size

空列表的大小:

sys.getsizeof([]) == 72

添加一个元素:
sys.getsizeof([1]) == 80

添加另一个元素:
sys.getsizeof([1, 1]) == 88

因此每个元素添加4个字节。
为了获得1024字节,我们需要
(1024 - 72) / 8 = 119
元素。

包含119个元素的列表的大小:

sys.getsizeof([None for i in xrange(0, 119)]) == 1080

这是因为列表保留了用于插入更多项目的额外缓冲区,因此不必每次都调整大小。(对于107到126之间的元素数量,大小等于1080)。

因此,我们需要一个不变的数据结构,不需要保留此缓冲区-

tuple

empty_tuple_size = sys.getsizeof(())          # 56single_element_size = sys.getsizeof((1,))     # 64pointer_size = single_element_size - empty_tuple_size    # 8n_1mb = (1024 - empty_tuple_size) / pointer_size         # (1024 - 56) / 8 = 121tuple_1mb = (1,) * n_1mbsys.getsizeof(tuple_1mb) == 1024

因此,这是您获得1MB数据结构的答案:

(1,)*121

但是请注意,这只是元组和组成指针的大小。对于总大小,您实际上需要将各个元素的大小相加。


备用:

sys.getsizeof('') == 37sys.getsizeof('1') == 38     # each character adds 1 byte

对于1 MB,我们需要987个字符:

sys.getsizeof('1'*987) == 1024

这是实际大小,而不仅仅是指针的大小。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5639901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存