Python中的内存管理
我刚开始学习Python。为了找出一个整数的大小,我使用了sys模块里的getsizeof方法。这个方法返回整数占用24个字节,字符占用34个字节。
>>> sys.getsizeof(1)
24
>>> sys.getsizeof('a')
34
我觉得这个大小(24个字节或34个字节)对于存储一个整数或字符来说太大了……我觉得这样会浪费很多内存。你能帮我理解一下Python中内存管理的概念吗?
2 个回答
2
每次你在Python中定义一个对象时,都会创建一个新的对象,并且这个对象有一个新的身份。
不过,有一些例外情况,比如小整数(在-5到256之间)和一些小字符串(特殊的字符串,通常长度小于20个字符),它们是单例对象,拥有相同的身份(实际上是一个对象有多个指针指向它)。
举个例子:
在[1]: L1 = [1, 2, 3]
在[2]: L2 = [1, 2, 3]
在[3]: id(L1)
输出[3]: 4436443080
在[4]: id(L2)
输出[4]: 4436349576
再举个例子:
在[5]: a = 10
在[6]: b = 10
在[7]: id(a)
输出[7]: 4401921584
在[8]: id(b)
输出[8]: 4401921584
15
因为在Python中,所有东西都是对象,所以每个对象都会有一些额外的开销。以CPython为例,每个对象至少需要存储一个类型指针和一个引用计数。此外,具体的对象还需要一些额外的空间来存放它们的数据。而且,对于某些对象来说,还有垃圾回收的开销。可以肯定的是,没有什么是“浪费”的,这种想法太傻了。
另外,Python里没有char
这种类型,像'a'
这样的字符其实是一个长度为1的字符串。