1 引出问题
众所周知,当我们在使用python时,如果想知道某个对象所占字节大小会用到下面这个函数:
即返回对象的字节大小,1个字节就是8个比特位。
但是,我们发现会出现如下问题:
显然,这个函数是有问题的。
2 解决方案
2.1 针对可迭代对象
针对可迭代对象,需要使用for循环对子元素的内存大小进行累加求和,才能获取其对象所占空间大小。注意,如果子对象是可迭代对象,那么还要使用一层循环。
可复制如下代码:
import sys
def get_size(a):
all_cap = 0
for item in a:
all_cap += sys.getsizeof(aa)
return (all_cap)
a = {1, 2, 3, 99} # 待测大小的对象
get_size(a)
2.2 针对字符串
直接上代码:
import sys
def get_size_string(s):
s_ones = sys.getsizeof(s)
s_fives = sys.getsizeof(s * 5)
return (s_fives - s_ones) // 4
a = "你好吗" # 待测大小的字符串
get_size_string(a)
理论证明:
其中,xxx是对象名称(地址)所占的内存大小,realstoragerealstoragerealstorage是对象的真实大小,aaa和bbb是可以直接通过sys.getsizeof函数获取的,是已知的。
realstorage+x=arealstorage + x = arealstorage+x=a
realstorage×5+x=brealstorage \times 5 + x = brealstorage×5+x=b
realstorage×4=b−arealstorage \times 4 = b - arealstorage×4=b−a
realstorage=(b−a)//4realstorage= (b - a) // 4realstorage=(b−a)//4