如果检查列表的大小,它将提供列表数据结构的大小,包括指向其组成元素的指针。它不会考虑元素的大小。
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
这是实际大小,而不仅仅是指针的大小。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)