我正在尝试创建一个大型布尔数组(用于素数筛)。我使用了第一个Python列表,但在limit = 10^9
处创建了MemoryError
。
boolarray = [True] * limit
然后我了解了Numpy并了解到空间组织更好,所以我尝试了
boolarray = np.full(limit, True, dtype = bool)
这个限制只是略微增加到10^10
,这还不够,因为我需要10^12
。我觉得这很令人惊讶,你只需要布尔一点,不是吗?任何想法,如何克服这个问题?提前谢谢。
答案 0 :(得分:2)
让我们撇开10 ^ 12位可能不容易融入内存的事实。如果您更关心内存使用情况而不是性能,则可以将这些位打包成字节数组。这是以读取/写入位时的额外计算为代价的(这是numpy将布尔值存储为字节的原因)。
import numpy as np
def getbit(bitarray, index):
i, j = index // 8, index % 8
x = bitarray[i]
return x & (1 << j) != 0
def setbit(bitarray, index, value):
value = bool(value)
i, j = index // 8, index % 8
x = bitarray[i]
bitarray[i] ^= (np.uint(-value) ^ x) & (1 << j)
n = 10**5 // 8
bitarray = np.zeros(n, dtype=np.uint8) # initialize all bits to 0
print(getbit(bitarray, 19)) # False
setbit(bitarray, 19, True)
print(getbit(bitarray, 19)) # True
setbit(bitarray, 19, False)
print(getbit(bitarray, 19)) # False