我的博客

python3 list 和 tuple 性能对比

目录
  1. list 版
  2. tuple 版

tuple 是不可变对象,理论上性能应该比 list 快。但是我在最近的次数据分析中发现,用 tuple 替换 list 反而导致内存和时间的消耗显著增多。所以我做了一个简单的实验。

定义一个 list,然后往 list 中 append 1 亿个 list 或者 tuple,其中的元素都是 1,2,3,4,5 五个数字。

1
2
3
4
5
6
7
8
9
$python3 test_tuple.py
100%|█████████████| 100000000/100000000 [00:23<00:00, 4185364.44it/s]

0.7727 GB

$ python3 test_list.py
100%|█████████████| 100000000/100000000 [01:14<00:00, 1339510.06it/s]

12.9193 GB

tuple 耗时 23 秒,使用内存 0.7727 GB

list 耗时 74 秒,使用内存 12.9193 GB

代码如下

通过简单的读取 /proc/meminfo 获得大致的内存消耗,windows 无法运行,还需要安装依赖 tqdm(pip install tqdm

list 版

1
2
3
4
5
6
7
8
9
10
11
12
13
from tqdm import tqdm
def get_free_mem():
with open('/proc/meminfo') as f:
f.readline()
f.readline()
return int(f.readline().split()[1])
f1 = get_free_mem()
l = []
for i in tqdm(range(100000000)):
l.append([1,2,3,4,5,])
f2 = get_free_mem()
print(f1-f2)
print((f1-f2)/1024/1024)

tuple 版

1
2
3
4
5
6
7
8
9
10
11
12
13
from tqdm import tqdm
def get_free_mem():
with open('/proc/meminfo') as f:
f.readline()
f.readline()
return int(f.readline().split()[1])
f1 = get_free_mem()
l = []
for i in tqdm(range(100000000)):
l.append((1,2,3,4,5,)
f2 = get_free_mem()
print(f1-f2)
print((f1-f2)/1024/1024)

以后如果有时间想去看看底层实现。

评论无需登录,可以匿名,欢迎评论!