在 Python 中处理大量字符串或数字时,你可能会遇到意想不到的内存占用问题。比如需要存储一百万个短字符串或数字,按每个字符串平均 10 字节、每个 64 位整数 8 个字节计算,理论上只需约 8 到 10MB 内存,但实际用 Python 列表存储时,内存使用可能会飙升到几十 MB。这背后的原因是什么?又该如何优化?
问题引入:列表存储的内存'膨胀'
咱们先来看段代码,用普通列表分别存储一百万个不同的短字符串、相同的短字符串、不同的整数、相同的整数:
str_list = [f"item_{i}" for i in range(1000000)]
same_item_str_list = [f"item" for i in range(1000000)]
num_list = [i for i in range(1000000)]
same_item_num_list = [0 for i in range(1000000)]
直觉上,每个字符串'item_xxx'大约 8-10 字节,每个整数 8 个字节,一百万条数据应该在 8 到 10MB 左右。但实际内存使用如何呢?我们用 pympler 来精确测量。
先安装 pympler:
pip install pympler
修改代码,增加测量内存占用情况的打印:
from pympler import asizeof
print(f"str_list 列表内存:{asizeof.asizeof(str_list)/1024/1024:.2f} MB")
print(f"same_item_str_list 列表内存:{asizeof.asizeof(same_item_str_list)/1024/1024:.2f} MB")
print(f"num_list 列表内存:{asizeof.asizeof(num_list)/1024/1024:.2f} MB")
()


