Memory management cython中的内存不足

Memory management cython中的内存不足,memory-management,cython,Memory Management,Cython,我正在尝试用cython实现一个算法。但是我的位集实现的内存不足。我不知道为什么,下面是我代码的有用快照 bitset.pyx diditul:语言= C++ 从libcpp.vector cimport vector cdef类位集: def ___; cinit __;(自身,整数大小): self.vector=向量[bint](大小) cpdef void inter(自身、位集或其他)除*: #在两个位集之间进行交集 cpdef void add(self,int元素): 如果0bi

我正在尝试用cython实现一个算法。但是我的
位集
实现的内存不足。我不知道为什么,下面是我代码的有用快照

bitset.pyx

<代码> diditul:语言= C++ 从libcpp.vector cimport vector cdef类位集: def ___; cinit __;(自身,整数大小): self.vector=向量[bint](大小) cpdef void inter(自身、位集或其他)除*: #在两个位集之间进行交集 cpdef void add(self,int元素):
如果0
bint
只是一个方便的整数类型,可用于存储真/假值。与所有其他C类型一样,它需要一个地址,可以用整个字节来衡量,因此它至少占用1个字节(实际上看起来更多)

为了以节省空间的方式存储布尔,您需要存储整数类型,然后执行一些位旋转以访问单个元素:

cdef uint8_t x = some_value
nth_element_is_true = bool(x & (1<<n)) # bitshift to get a suitable mask then bitwise and

在C++中,创建一个专门的<代码>向量,它与普通<代码>向量完全不一样。在C++中,它被认为是坏主意,但是它符合你的需要。

<代码> BITE< /COD>将至少是字节而不是一点。C++可能更好,但我不认为Cython有一个预先编写的包装器,或者是优化的<代码> STD::vector < /代码>,虽然我不确定TATI的状态对于BIt不知道100%。这可以解释很多事情。你怎么知道的?你可以通过
print(sizeof(bint))
来测试它(而不是信任我)。本质上,C/C++中的任何变量都必须至少占用一个字节。任何更有效的方案都将存储
uint8_t
s(或类似的),然后访问其中的单个位-这就是
bitset
vector
所做的,但速度代价很小……尽管请记住
sizeof
以字节为单位返回答案(这是一种线索,所有内容的大小都必须以整字节为单位)经过调查,bint存储在4个字节上,而不是1/8B。这将使bint乘以32。如果您编写一个答案@DavidW,我可能会接受它,我将使用uint8_t!对我的代码进行优化:)
from libcpp.vector cimport vector
from libcpp cimport bool
cdef vector[bool] vb = vector[bool](1000000)