Python布尔字节大小

Shi*_*hah 6 python

显然整数在 Python 中需要 24 个字节。我可以理解这样做是因为表示无限数字的额外花里胡哨。然而,看起来布尔数据类型也花费了 24 个字节,即使它可能只代表两个值。为什么?

编辑:我不是要求最好的方式来存储布尔值。我已经从其他答案中了解到 NumPy、BitArray 等。我的问题是为什么,而不是如何。只是为了清楚和专注,我已经删除了问题的第二部分。

use*_*ica 5

Abool对于它所代表的内容来说可能非常大,但只有两个。一个充满Trues的列表仅包含对一个规范True对象的4 或 8 字节引用。

如果 8 个字节仍然太大,并且您确实想将 Python 用于您正在做的任何事情,您可以考虑使用内置array模块或 NumPy提供的数组类型。这些提供 1 字节/bool 表示。如果这仍然太多,您可以使用位集,或者使用 Python 的内置 bignum 手动或使用BitVectorPyPI 之类的东西。这些选项可能会减慢您的程序速度。其中一些可以提高速度,但前提是您利用了让您将工作从解释代码中推送到 C 中的功能。

  • @ShitalShah:正如大家所指出的,`True` 和 `False` 是单例对象,因此存储额外布尔值的增量成本只是引用它们的指针(4 或 8 个字节)。开销的优点是 Python 对象的一致内部表示。它们都共享一个公共头,并且该公共头包含一些固定开销;一个指向类型对象的指针(4-8 个字节),一个引用计数(4-8 个字节),在 `bool` 的情况下,实际值,它与结构填充增加了另外 4-8 个字节。通用结构意味着它们可以在 C 中统一处理。 (5认同)
  • @johnsharpe - 我并不“担心”这个。问题只是试图了解语言设计决策的利弊。我已经进行了足够的搜索,但找不到任何人对这个设计决策提供见解。这不是一个重复的问题。 (3认同)
  • @ShitalShah:如果你的程序空间太紧以至于你需要担心 `True` 和 `False` 消耗的 48 个字节,你可能没有在带有操作系统的机器上工作,更不用说 Python 解释器了。 (2认同)