在玩sys.getsizeof()
时,我注意到它随着ints
的大小增加而返回更高的值,表明它们使用了更多的内存:
>>> sys.getsizeof(3)
28
>>>
>>> sys.getsizeof(300000000000000000000000)
36
然而,无论使用floats
,无论大小如何,我都会获得相同的内存使用量:
>>> sys.getsizeof(3.0)
24
>>> sys.getsizeof(300000000000000.111111111)
24
>>> sys.getsizeof(300000000000000000000000.111111111)
24
>>> sys.getsizeof(300000000000000000000000.1111133333333331111)
24
根据docs,我应该找回内置类型的准确内存使用情况:
以字节为单位返回对象的大小。该对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但是对于第三方扩展,这不一定成立,因为它是特定于实现的
答案 0 :(得分:2)
float
之所以命名,是因为它们是浮点数。
为简化起见,floats
被存储为a * b ** c
,其中a
,b
和c
分别占据固定的 分别为位数。因此,直观地讲,如果f
是浮点数,则f * 10 ** 10
不会比f
占用更多的空间,因为我们只需要将c
增加log_2 log_2 (10 ** 10) = 5
(通常,b
是一个常数,例如2)。
当然,另一方面是,我们只能用浮点数表示一定数量的有效数字,这就是为什么一段时间后会出现舍入错误的原因。
在Python中,ints
是定点的,任意精确的和可变宽度。这意味着int
可以根据内存限制增长到想要的大小。占用的空间量与其大小成正比,因为它必须单独(或多或少)存储每个数字,而不是像floats
中那样进行基于指数的计算。因此,将int
i
乘以10 ** 10
将需要log_2(10 ** 10) = 33
额外的位。
出于完整性考虑,我会注意到在类似C
的地方,对应的int
是固定宽度的,例如float
,因此等效的sizeof
将返回不论int
的大小如何,该值都是相同的。