列表(List)和元组(Tuple)的占用空间比较

问题的提出:

Tuple比List节约内存空间?节约多少?为什么?

使用函数  a.__sizeof__() 可获得对象a所占用的内存。

Test 1. 连续整数

构造如下:

SizeOfList=[list(range(n)).__sizeof__() for n in range(1,100)]
SizeOfTuple=[tuple(range(n)).__sizeof__() for n in range(1,100)]
SizeOfList10=[list(range(10*n)).__sizeof__() for n in range(1,100)]
SizeOfTuple10=[tuple(range(10*n)).__sizeof__() for n in range(1,100)]

Test 2. 随机长度字符串

构造如下: 

import random
n=10
def getL(n,sMax=5):
	return list("".join(
		random.choices([chr(i) for i in range(ord('a'),ord('z')+1)],k=random.randint(1,sMax))
		) for j in range(n))
def getT(n,sMax=5):
	return tuple("".join(
		random.choices([chr(i) for i in range(ord('a'),ord('z')+1)],k=random.randint(1,sMax))
		) for j in range(n))
T=getT(n)
L=getL(n)
T2=tuple(L) # tuple转换list得到的T2,和随机生成新的T 的 比较
print(L,T,T2,sep="\n")
print("size of list/tuple:",L.__sizeof__(),T.__sizeof__(),T2.__sizeof__())
print("size of sum of elements:",end="\t")
print(sum([l.__sizeof__() for l in L]),
	sum([t.__sizeof__() for t in T]),
	sum([t2.__sizeof__() for t2 in T2]))

x=range(1,100)
Ls=[getL(n) for n in x]
Ts=[getT(n) for n in x]
T2s=[tuple(l) for l in Ls]
sizeOfLs=[L.__sizeof__() for L in Ls]
sizeOfTs=[T.__sizeof__() for T in Ts]
sizeOfT2s=[T2.__sizeof__() for T2 in T2s]
sumsizeOfLs=[sum([l.__sizeof__() for l in L]) for L in Ls]
sumsizeOfTs=[sum([t.__sizeof__() for t in T]) for T in Ts]
sumsizeOfT2s=[sum([t2.__sizeof__() for t2 in T2]) for T2 in T2s]
print("max size of list/tuple:",max(sizeOfLs),max(sizeOfTs),max(sizeOfT2s))
print("max size of sum of elements:",max(sumsizeOfLs),max(sumsizeOfTs),max(sumsizeOfT2s))

Ls10=[getL(10*n) for n in x]
Ts10=[getT(10*n) for n in x]
T2s10=[tuple(l) for l in Ls10]
sizeOfLs10=[L.__sizeof__() for L in Ls10]
sizeOfTs10=[T.__sizeof__() for T in Ts10]
sizeOfT2s10=[T2.__sizeof__() for T2 in T2s10]
sumsizeOfLs10=[sum([l.__sizeof__() for l in L]) for L in Ls10]
sumsizeOfTs10=[sum([t.__sizeof__() for t in T]) for T in Ts10]
sumsizeOfT2s10=[sum([t2.__sizeof__() for t2 in T2]) for T2 in T2s10]
print("max size of list/tuple *10:", max(sizeOfLs10),max(sizeOfTs10),max(sizeOfT2s10))
print("max size of sum of elements *10:", max(sumsizeOfLs10),max(sumsizeOfTs10),max(sumsizeOfT2s10))

输出结果:

['p', 'ixxe', 'harzf', 'awd', 'qrtoo', 't', 'fpbsa', 'yt', 'zpsfi', 'sry']
('i', 'vpcnz', 'siyju', 'jbi', 'kqmx', 'im', 'e', 'jzf', 'z', 'zo')
('p', 'ixxe', 'harzf', 'awd', 'qrtoo', 't', 'fpbsa', 'yt', 'zpsfi', 'sry')
size of list/tuple: 168 104 104
size of sum of elements:    524 517 524
max size of list/tuple: 904 816 816
max size of sum of elements: 5140 5134 5140
max size of list/tuple *10: 8840 7944 7944
max size of sum of elements *10: 51498 51602 51498

结论:

1. Tuple变量占用空间,比List略少,差距不大。
2. 两者差距,整型变量为元素的较稳定,字符串变量为元素的,如仅计算列表/元组变量的呈阶梯状上升,且同比增大,如计算所有元素占用空间之和,则列表与元组无差异。
3. 列表转元组后,与直接构造的元组占用空间一致。但如果计算元素和,则列表转的元组与列表一致。(因引用的是同一批字符串)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jikuibu2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值