sys.getsizeof()的值不会随着float值的增加而增加

时间:2019-04-23 04:37:06

标签: python memory sys

在玩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,我应该找回内置类型的准确内存使用情况:

  
    

以字节为单位返回对象的大小。该对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但是对于第三方扩展,这不一定成立,因为它是特定于实现的

  

1 个答案:

答案 0 :(得分:2)

float之所以命名,是因为它们是浮点数

为简化起见,floats被存储为a * b ** c,其中abc分别占据固定的 分别为位数。因此,直观地讲,如果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的大小如何,该值都是相同的。