如何在Python中创建位数组?

问题描述 投票:0回答:6

如何声明一个非常大的位数组,比如 600 万位?

python arrays bit
6个回答
46
投票
from bitarray import bitarray

a = bitarray(2**20)

您可以在 http://pypi.python.org/pypi/bitarray/

查看有关此模块的更多信息

29
投票

bitstring模块可能会有所帮助:

from bitstring import BitArray
a = BitArray(6000000)

这将占用不到一兆字节的内存,并且很容易设置、读取、切片和解释位。与 bitarray 模块不同,它是纯 Python,而且适用于 Python 3。

请参阅文档了解更多详细信息。


11
投票

此单行代码将字节转换为 True/False 位值列表。对于 6M 位可能性能不佳,但对于小标志来说应该没问题,并且不需要额外的依赖项。

>>> flags = bytes.fromhex(b"beef")
>>> bits =  [flags[i//8] & 1 << i%8 != 0 for i in range(len(flags) * 8)]
>>> print(bits)
[False, True, True, True, True, True, False, True, True, True, True, True, False, True, True, True]

11
投票

很容易

bitarray60000 = 1<<60000

这样,您就可以使用位移运算符来满足您的需要了。 例如,位置 2 设置为 True 将是:

bitarray60000 | 1<<2

从位置 2 获取位

bitarray60000 & 1<<2

我想这个想法很简单。虽然有些操作可能会很棘手。


10
投票

使用

获取位数组模块
pip install bitarray

然后,这段代码将创建一个大小为 600 万的位数组,

from bitarray import bitarray
bit_array = bitarray(6000000)

您可以使用

将所有位初始化为零
bit_array.setall(0)

要将特定位(例如位号 25)设置为 1,请执行以下操作:

bit_array[25]=1   

0
投票

如果您想避免对第三方软件包的依赖,那么滚动您自己的

bitarray
克隆非常容易。今天我需要类似
array.array
的东西,而且我只需要迭代和(小端)
tobytes
,所以以下内容就足够了:

class BitArray:
    def __init__(self, iterable):
        self._arr = list(map(bool, iterable))
    def __iter__(self):
        return iter(self._arr)
    def tobytes(self):
        return bytes(
            sum((bit << i for (i, bit) in enumerate(batch)), 0)
            for batch in itertools.batched(self._arr, 8))

如果空间消耗是一个问题,那么以下会产生更紧凑的表示:

class BitArray:
    def __init__(self, iterable):
        last_i = 7
        self._blob = bytes(
            sum((bool(bit) << (last_i := i)
                 for (i, bit) in enumerate(batch)), 0)
            for batch in itertools.batched(iterable, 8))
        self._bits_in_last_byte = (last_i + 1) & 7
    def __iter__(self):
        return itertools.chain(
            (bool((x >> i) & 1) for x in self._blob[:-1] for i in range(8)),
            (bool((self._blob[-1] >> i) & 1)
             for i in range(self._bits_in_last_byte)))
    def tobytes(self):
        return self._blob
© www.soinside.com 2019 - 2024. All rights reserved.