Python:内存中字符串的大小

时间:2012-02-25 15:13:51

标签: python arrays memory-management

请考虑以下代码:

arr = []
for (str, id, flag) in some_data:
    arr.append((str, id, flag))

想象一下,输入字符串平均为2个字符长,5个字符最大,some_data有100万个元素。 这种结构的内存要求是什么?

可能是因为字符串浪费了大量内存?如果是这样,我该如何避免呢?

2 个答案:

答案 0 :(得分:25)

在这种情况下,由于字符串非常短,并且有很多字符串,因此您可以通过在字符串上使用intern来节省大量内存。假设字符串中只有小写字母,那就是26 * 26 = 676个可能的字符串,所以在这个列表中必须有很多重复; intern将确保这些重复不会产生唯一对象,但所有重复都引用相同的基础对象。

Python可能已经实现了短字符串;但是看一些不同的来源,似乎这是高度依赖于实现的。因此,在这种情况下调用intern 可能是的方式; YMMV。

详细说明为什么这很可能会节省内存,请考虑以下事项:

>>> sys.getsizeof('')
40
>>> sys.getsizeof('a')
41
>>> sys.getsizeof('ab')
42
>>> sys.getsizeof('abc')
43

向字符串添加单个字符只会在字符串本身的大小上添加一个字节,但每个字符串自己占用40个字节。

答案 1 :(得分:1)

如果您的字符串太短,很可能会有大量的重复项。 Python实习将优化它,以便这些字符串只存储一次,引用使用多个tiems,而不是多次存储字符串......

这些字符串应该按原样自动实现。