sys.getsizeof() 值不随浮点值的增加而增加

sys.getsizeof() value doesn't increase with increase of float value

在玩 sys.getsizeof() 时,我注意到 returns 随着它们的大小增加,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,我应该得到内置类型的准确内存使用情况:

Return the size of an object in bytes. The object can be any type of object. All built-in objects will return correct results, but this does not have to hold true for third-party extensions as it is implementation specific

名称 float 是因为它们是 浮点数 数字。

为了简化,floats存储为a * b ** c,其中abc各占一定的分别固定位数。因此,直觉上,如果 f 是一个浮点数,f * 10 ** 10 不会比 f 占用更多 space,因为我们只需要将 c 增加 log_2 log_2 (10 ** 10) = 5(一般情况下,b是一个常数,比如2)。

当然,这样做的另一面是我们只能用浮点数表示一定数量的有效数字,这就是为什么 运行 一段时间后会出现舍入错误的原因。

在Python中,ints为定点、任意精度和可变宽度。这意味着 int 可以根据内存限制增长到您想要的大小。它占用的 space 的数量与其大小成正比,因为它必须单独存储每个数字(或多或少),而不是像 floats 那样进行基于指数的计算。因此,将 int i 乘以 10 ** 10 将需要 log_2(10 ** 10) = 33 额外位。

为了完整起见,我会注意到在 C 之类的内容中,对应的 intfloat 一样是固定宽度的,因此等效的 sizeof 将return 与 int.

的大小无关的相同值