📜  内存中Python对象的意外大小(1)

📅  最后修改于: 2023-12-03 14:50:08.303000             🧑  作者: Mango

内存中Python对象的意外大小

Python是一种高级编程语言,它提供了很多方便的数据类型和容器来方便程序员进行编程。然而,在Python中使用这些对象时,程序员需要注意其在内存中所占用的大小,特别是一些意外的大小情况。

整数对象的大小

整数对象在Python中通常是通过C实现的,并且其内存大小通常是固定的(通常是28个字节)。但是,Python在使用整数对象时会自动进行内存管理,例如在大量使用整数时,Python会自动使用更小的内存区块进行内存分配。

>>> import sys
>>> sys.getsizeof(1)
28
>>> sys.getsizeof(2**63)
36
>>> sys.getsizeof(2**10000)
1400

如上所示,Python中的整数对象大小可能会因值的大小而异。在上述示例中,我们可以看到32位整数对象在内存中占用的大小为28个字节,而64位整数对象在内存中占用的大小为36个字节。此外,在Python 3.x中,长整数对象(即大于sys.maxsize的整数)为变长对象,其大小取决于所需的位数。

字符串对象的大小

在Python中,字符串对象也是常用的数据类型之一。Python的字符串对象实际上是由一系列的字符或字节序列组成。

>>> sys.getsizeof('1')
50
>>> sys.getsizeof('a')
50

在上述示例中,我们可以看到单个字符字符串对象占用了50个字节的内存。这是因为,Python在为字符串对象分配内存时,除了存储字符串本身,还需要存储一些元信息(例如长度、字符编码等)。

除了字符串长度本身外,字符串对象的内存大小还可以受到其他因素的影响。例如在Python 2.x中,字符串对象会在字符串分配时保留空余空间,以便后续的字符串分配可以使用未使用的空间。此类浪费的空间将加大Python程序消耗的内存。

其他对象的大小

除了上述示例中的整数对象和字符串对象之外,Python还有很多其他内存占用不同的对象类型。例如,列表对象、元组对象和字典对象的大小都可以因对象中所包含的元素而异。

>>> sys.getsizeof([])
64
>>> sys.getsizeof([0, 1, 2])
88
>>> sys.getsizeof(())
48
>>> sys.getsizeof((0, 1, 2))
64
>>> sys.getsizeof({})
240
>>> sys.getsizeof({1: 'a', 2: 'b'})
240

如上所示,Python中的容器对象大小可能会因元素数量的不同而异。此外,一些Python内建对象的元信息(例如进程ID和线程ID等)也可能会占用额外的内存。

总结

在Python中,不同的对象类型和数据量都可能会影响其在内存中所占用的大小。程序员需要特别注意这些问题,以便尽可能减少Python程序的内存消耗。我们可以使用sys.getsizeof函数来查询Python对象在内存中所占用的大小。