2015-12-29 47 views
2

Python中显然整数需要24个字节。我可以理解,这是因为代表无限数额的额外花招和哨声。然而,它看起来像布尔数据类型也花费百日咳24个字节,即使它可能只代表两个值。为什么?Python布尔字节大小

编辑:我不是要求最好的方式来存储bools。我已经知道其他答案的NumPy,BitArray等。我的问题是为什么,而不是如何。只是为了清楚和关注我已经删除了问题的第二部分。

+2

1.因为布尔值是整数子类。 2.不,如果你关心Python对你来说可能不够低(或者你需要使用类似'numpy'的东西)。 – jonrsharpe

+1

使用ctypes我猜...但真的如果你担心这个python可能不是这个特定项目的语言的正确选择... –

+0

“我可以理解,这是因为额外的钟声和口哨代表无界限号码“ - 不。它就像类型指针和引用计数一样。在Python 2中,'long',实际的bignum类型,甚至有*更大*的实例。 – user2357112

回答

2

A bool对于它代表的内容可能相当大,但只有其中的两个。一个完整的列表True s只包含4或8个字节的引用到一个规范的True对象。

如果8个字节仍然过大,并且您确实想要使用Python,您可以考虑使用类似于内置的array模块或NumPy提供的数组类型。这些提供每字节1个字节的表示。如果这仍然太多,你可以使用一个bitset,或者用Python的内置bignums手动或者像PyPI的BitVector这样的东西。 这些选项可能会减慢程序的运行速度。它们中的一些可以提供速度改进,但前提是您利用了可以将解释代码推送到C中的功能。

+0

我知道使用NumPy,BitVector等的替代方法。我试图找出Python设计器用来让布尔占用24个字节的内部推理。 Python中的大部分内容都经过了深思熟虑,但是这... – ShitalShah

+2

@ShitalShah:如果你的程序太紧张了,你需要担心'True'和'False'消耗的48个字节,可能不适用于带有操作系统的机器,更不用说Python解释器了。 – user2357112

+0

@ShitalShah再次,如果你担心这种事情,*停止使用Python!*如果你想做这种微型优化,有很多低级语言;这不是Python的设计目标。 – jonrsharpe