Python布尔字节大小

Python布尔字节大小,python,Python,显然,在Python中整数需要24字节。我可以理解,它之所以这样做,是因为有额外的钟声和哨声来表示无界数。然而,看起来布尔数据类型也需要花费24字节,即使它可能只代表两个值。为什么? 编辑:我不是在问存储bools的最佳方法。我已经从其他答案中了解到NumPy、BitArray等。我的问题是为什么,而不是如何。为了清楚并集中注意力,我已经删除了问题的第二部分。Abool对于它所代表的内容来说可能是非常巨大的,但只有两个。一个充满Trues的列表只包含对一个规范True对象的4字节或8字节引用 如

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


编辑:我不是在问存储bools的最佳方法。我已经从其他答案中了解到NumPy、BitArray等。我的问题是为什么,而不是如何。为了清楚并集中注意力,我已经删除了问题的第二部分。

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


如果8个字节仍然太大,并且你真的想用Python做任何你正在做的事情,你可以考虑使用一个数组类型,比如内置的<代码>数组< /COD>模块或NUMPY所提供的数组类型。它们提供每bool 1字节的表示。如果这仍然太多,您可以使用位集,可以手动使用Python的内置bignum,也可以使用类似PyPI的东西这些选项可能会降低程序的运行速度。其中一些选项可以提高速度,但前提是您要充分利用这些功能,将工作从解释代码中推到C中。

1。因为布尔是整数子类。2.不,如果你关心Python对你来说可能不够低级(或者你需要使用
numpy
之类的东西)。。。但是,如果您真的担心python可能不是这个特定项目的正确语言选择……”“我可以理解,它之所以这样做是因为它需要额外的铃铛和口哨来表示无界数字”——不。比如类型指针和引用计数。在Python2上,
long
,实际的bignum类型,有更大的实例。
True
False
都是单例,所以不会浪费太多内存!同样相关:,它从历史的角度回答了您的问题。我知道使用NumPy、BitVector等的替代方法。我正在试图找出Python设计者让布尔值占据24字节的内部原因。Python中的大部分内容都是经过深思熟虑的,但这…@ShitalShah:如果你的程序空间太大,以至于你需要担心
True
False
所消耗的48字节,那么你可能不是在一台有操作系统的机器上工作,更不用说Python解释器了。@ShitalShah,如果您担心这类事情,请停止使用Python!如果你想做这种微观优化,有很多低级语言;这不是Python的设计目标。@johnsharpe-我对此并不“担心”。问题只是试图理解语言设计决策的利弊。我已经搜索够了,我找不到任何人对这个设计决策有任何见解。这不是一个重复的问题。@ShitalShah:正如大家所注意到的,
True
False
是单例对象,因此存储额外布尔值的增量成本只是引用它们的指针(4或8字节)。这种开销的优点是Python对象的一致内部表示。它们都共享一个公共头,该公共头包括一些固定的开销;一个指向类型对象(4-8字节)的指针,一个引用计数(4-8字节),如果是
bool
,则是实际值,该值与结构填充一起再增加4-8字节。通用结构意味着它们可以在C中统一处理。