观察以下内容(在Python第2.7.3节中):
>>> import sys
>>> sys.getsizeof(1)
24
>>> sys.getsizeof(10000)
24
为什么较大的整数只占用较小整数的相同内存量(堆的内存为afaik)?
比较以下
>>> sys.getsizeof("1")
38
>>> sys.getsizeof("100000")
42
答案 0 :(得分:2)
如果执行
sys.getsizeof("1")
vssys.getsizeof("100000")
,则较大的字符串会占用更多内存。那为什么整数会有所不同呢?
因为整数不是逐个字符存储的。
在Python中,整数的开始与平台的本机字一样大(加上解释器内部簿记所需的额外空间),因为算术速度更快 - 如果使用本机类型,处理器可以直接对它们进行算术运算。
当你超出本机字边界(在32位机器上的-2 ** 31 - (2 ** 31-1))时,Python会自动切换到任意精度算术,其中操作被模拟" ;在软件中(当然建立在硬件提供的通常基元上)。
这仍然不会给你一个类似字符串的"增加,因为更大的块中使用的空间增加(再次,通常出于效率原因)。
此外,寻找1:1十进制数字 - 整数大小关系会产生误导,因为整数存储在二进制中,十进制数字"采用" ~3.32二进制数字;所以,大小"跳跃"不会在"十进制数字"边界,但更多的是两个边界的力量。
答案 1 :(得分:1)
字符串和整数确实具有可比性,因为它们可以被视为一个任意长的数字"数字"或"字符"。当你使用足够大的整数(如2 ^ 70,5e100,......)时,将看到内存使用率上升 1 。当你添加一个"字符" /"数字"无论如何,内存使用率都会上升。对于字符串,一个"字符"大概是你所期望的(unicode变得更复杂,但无论如何)。
然而,对于整数,一个"数字"非常大:几十位(而不是一个十进制数字,更不用说一位)。这部分是因为内存被分为比特和比特组(而不是十进制数字),部分是你不能分配单个比特(最多单个字节,但即便这样也是浪费),部分原因是因为它是对CPU可以工作的那么多位更有效。本地" (通常为4到8个字节),部分是为了简化代码。
Python 2有两种整数类型int
和long
的额外复杂性。在上述解释的上下文中,int
是一个奇怪的例外,因为它们允许您使用更大的单个数字(例如64位而不是30位),但只有数字符合该单个数字。一般原则仍然适用。
1 虽然这些整数将包含long
类,而不是int
。