【问题标题】:How does Python manage size of integers and floats? [duplicate]Python 如何管理整数和浮点数的大小? [复制]
【发布时间】:2020-08-19 08:44:18
【问题描述】:

我正在运行一台 64 位机器。 如果我输入getsizeof(int()),我得到 24。使用这 24 个字节的元素或对象是什么? 以下是一些更令人困惑的结果: getsizeof(0) 返回 24。 getsizeof(1) 返回 28。为什么 1 比 0 多占用 4 个字节? getsizeof(1.5) 返回 24。为什么浮点数 1.5 的大小比整数 1 小。

【问题讨论】:

标签: python python-3.x


【解决方案1】:

我现在只讨论整数,最后看看浮点数。

在 Python 中,与 C 和许多其他语言不同,int 不仅仅是一种存储数字的数据类型。它是一个完整的对象,带有关于该对象的额外信息(更多详细信息here)。

这些额外的信息会占用大量空间,这就是对象看起来异常大的原因。具体来说,它占用了 3 批 8 字节(3*8=24 字节)。这些是引用计数、类型和大小。

Python 使用特定数量的字节存储整数,具体取决于它们的大小。具体来说:

0 <= n < 2**0:
    requires 24 bytes
2**0 <= n < 2**30:
    requires 28 bytes
2**30 <= n < 2**60:
    requires 32 bytes

一般来说,2 的 30 次方每增加一次(因为需要更好的术语!),需要 4 个额外的字节。

这种模式也适用于负数,只是方向相反。

这些特定值是我计算机上的值,但会因运行 Python 的环境而异。但是,一般模式可能是相同的。

我相信(正如一点here 所解释的那样)单独零使用较少空间的原因是 only int 可以仅使用 24 个字节表示为零,因此不需要额外存储实际值,减小大小。我可能误解了这个具体案例,如果有,请在下面纠正我!

但是,浮点数的存储方式不同。它们的值仅使用 64 位(即双精度)存储,这意味着有 8 个字节表示该值。由于这永远不会改变,因此不需要像我们使用整数那样存储大小,这意味着只有两个 8 字节的值与特定的浮点值一起存储。这意味着总大小是两批 8 字节的对象数据和一批 8 字节的实际值,或总共 24 字节。

正是这种不需要存储值大小的属性释放了 8 个字节,这意味着 1.5 需要的空间比 1 少。

【讨论】:

  • 至于 0 需要“无”空格:CPython 整数大致是基数为 4294967296 的数字 - 或无符号的 4 字节“数字”。这意味着2**32 是一个“2 位”数字,就像基数为 10 的 12。同样,1 是一个“1 位”数字,就像基数为 10 的 1。我们当然可以在任何基础上写01001 等等,但是没有任何优势,因此前导零被删除1。同样,“数字”0 可以不带前导零来表示——给出一个“0 位”数字。唯一需要的空格是将对象标记为整数,这样就清楚地定义了一个 0 位数字。
猜你喜欢
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多