Python numpy布尔数组中的内存溢出

Python numpy布尔数组中的内存溢出,python,python-3.x,numpy,boolean,Python,Python 3.x,Numpy,Boolean,我正在尝试创建一个大型布尔数组(用于素数筛)。我使用了第一个Python列表,但在limit=10^9时创建了一个MemoryError boolarray = [True] * limit 然后我了解了Numpy,并读到它与空间组织更好,所以我尝试了 boolarray = np.full(limit, True, dtype = bool) 限制仅略微增加到10^10,这是不够的,因为我需要10^12。我觉得这很奇怪,你只需要一点布尔值,不是吗?有没有办法,如何克服这个问题?提前感谢。让

我正在尝试创建一个大型布尔数组(用于素数筛)。我使用了第一个Python列表,但在
limit=10^9
时创建了一个
MemoryError

boolarray = [True] * limit
然后我了解了Numpy,并读到它与空间组织更好,所以我尝试了

boolarray = np.full(limit, True, dtype = bool)

限制仅略微增加到
10^10
,这是不够的,因为我需要
10^12
。我觉得这很奇怪,你只需要一点布尔值,不是吗?有没有办法,如何克服这个问题?提前感谢。

让我们把10^12位可能不容易放入内存这一事实放在一边。如果您更关心内存使用而不是性能,那么可以将位打包到字节数组中。这是以读/写位时的额外计算为代价的(这就是numpy将布尔存储为字节的原因)

将numpy导入为np
def getbit(位数组,索引):
i、 j=索引//8,索引%8
x=位数组[i]

返回x&(1:
bool\uboolean(True或False)存储为字节
。现在我让其他人/你对这个设计决策进行一些研究。它与CPU架构和预期用例高度相关。好吧,我可能犯了一个错误,所以你需要验证:)(我将这个数字计算为
10**12/(8*1024**3)
)。除非你有一个疯狂的内存量,否则你可能应该寻找一个不同的方法。@Piintesky你可能会发现有趣的。它讨论了有效存储素数的方法。然而,我不确定这是否有助于首先生成它们……非常好。这也是我一直在想的。以防万一,其他人对编程不太感兴趣,只是想得到一个实用的解决方案——有这样的C库。也有primesieve库。感谢您的解释和示例。从我第一次自编求和函数的经验来看,在我发现Python函数
sum()
之前:我假设这些操作意味着更多的计算时间,因为它们不会直接向Python提供参数,以便在用C编写的库中高效地处理数据。如果这是真的,那么我恐怕这意味着回到绘图板上。@Piintesky-Jep,如果你经常调用这些函数——我想你会这么做的——你会注意到解释器的开销。无论如何,这并不能解决将10^12位压缩到ram中的问题,但我认为无论如何回答这个问题都是值得的,因为它对其他人也很有用。我把它标记为一个好答案,因为它表明我走错了方向。这对我来说是很有价值的信息(也许其他人也一样)。
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