栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634029.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号