Python布尔类型的字节大小

8
显然在Python中,整数占用24个字节。我可以理解这是因为表示无限数字需要额外的细节处理。但是布尔数据类型也占用了24个字节,即使它只包含两个值。为什么?
编辑:我不是在询问存储布尔型变量的最佳方法。我已经从其他答案中了解到NumPy、BitArray等工具。我的问题是“为什么”,而不是“如何”。为了明确和集中讨论此问题,我删除了第二部分内容。

3
  1. 因为布尔值是整数子类。
  2. 不,如果您关心Python可能不够低级(或者您需要使用像numpy这样的东西),那么它可能不适合您。
- jonrsharpe
1
我猜你可以使用ctypes...但是如果你对此感到担忧,那么Python可能不是这个特定项目的正确选择... - Joran Beasley
我认为“接受它”不是正确的答案。我假设Python的设计者们非常聪明,他们一定有让布尔类型占用大量24字节内存的原因。这种设计不仅浪费了内存,而且还减慢了与此类型的操作。一定有很好的理由。 - Shital Shah
2
TrueFalse是单例,所以它们并不浪费太多内存! - jonrsharpe
2
同样相关的是:https://dev59.com/iWsz5IYBdhLWcg3wADS6,从历史角度回答了你修改问题后的内容。 - jonrsharpe
显示剩余2条评论
1个回答

6
一个布尔值(bool)表示的东西可能非常巨大,但仅有两个。一个包含许多 True 的列表只包含对一个规范化的 True 对象的4字节或8字节引用。如果8字节还是太大,并且您确实希望使用Python完成您正在做的事情,那么可以考虑使用类似于内置array模块或NumPy提供的数组类型。 这些提供了每个布尔值1字节的表示形式。如果这仍然过大,可以使用位集,手动使用Python的内置bignums或像PyPI中的BitVector这样的工具。但这些选项很可能会严重减慢程序的运行速度。其中一些可以提高速度,但前提是您利用特性将工作从解释代码中推向C代码。

1
我知道使用NumPy,BitVector等的替代方案。我正在努力弄清Python设计者使用布尔值占用24个字节的内在原因。Python中的大多数内容都非常精心设计,但是这一点... - Shital Shah
2
如果你的程序空间如此紧张,以至于你需要担心TrueFalse所消耗的48个字节,那么你可能不是在一台有操作系统的机器上工作,更别提Python解释器了。 - user2357112
@ShitalShah 如果你担心这种情况,停止使用Python!如果你想进行这种微观优化,有许多低级语言可供选择;但这并不是Python的设计目标。 - jonrsharpe
6
@johnsharpe - 我并不“担心”这个问题。这个问题只是想了解语言设计决策的利弊。我已经搜索过足够多的资料,但是我找不到任何人对这个设计决策提供深入的见解。这不是一个重复的问题。 - Shital Shah
8
正如大家所指出的,TrueFalse是单例对象,因此存储额外布尔值的增量成本仅为引用它们的指针(4或8个字节)。优点在于Python对象的内部表现始终保持一致。它们都共享一个公共头,该公共头包括一些固定开销;指向类型对象的指针(4-8字节),引用计数(4-8字节),以及在bool的情况下,实际值,其结构填充另加4-8字节。这个公共结构意味着它们可以在C中统一处理。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接