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)
理论证明:
其中,
x
x
x是对象名称(地址)所占的内存大小,
r
e
a
l
s
t
o
r
a
g
e
realstorage
realstorage是对象的真实大小,
a
a
a和
b
b
b是可以直接通过sys.getsizeof函数获取的,是已知的。
r
e
a
l
s
t
o
r
a
g
e
+
x
=
a
realstorage + x = a
realstorage+x=a
r
e
a
l
s
t
o
r
a
g
e
×
5
+
x
=
b
realstorage \times 5 + x = b
realstorage×5+x=b
r
e
a
l
s
t
o
r
a
g
e
×
4
=
b
−
a
realstorage \times 4 = b - a
realstorage×4=b−a
r
e
a
l
s
t
o
r
a
g
e
=
(
b
−
a
)
/
/
4
realstorage= (b - a) // 4
realstorage=(b−a)//4