在 Python 中处理大量字符串时,你可能会遇到意想不到的内存占用问题。比如需要存储一百万个短字符串或数字,按每个字符串平均 10 字节、每个 64 位整数 8 个字节计算,理论上只需约 8 到 10MB 内存,但实际用 Python 列表存储时,内存使用可能会到几十 MB。这背后的原因是什么?又该如何优化?
1. 问题引入:列表存储的内存'膨胀'
先看一段简单的代码,用普通列表存储一百万个短字符串、相同的短字符串、整数、相同的整数:
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:
uv add pympler
修改代码,增加测量内存占用情况的打印:
from pympler import asizeof
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()]
()
()
()
()


