使用bitarray而不是int来节省dict的内存?

ric*_*izy 5 c++ python cython bitarray bitset

我试图减少python dict的内存消耗,在我的情况下,它作为word-->document_id"倒排索引".每个word都作为整数进行哈希处理,占用24个字节.

我想知道我是否可以将每个元素dict的值和每个键转换dict为一个bitarray.我注意到任何遇到的最大值int都小于2^22,所以我可以只分配一个"22号"的位数组.

如何才能做到这一点?到目前为止,我已经看过gmpy2bitarray库,以及std::bitsetC++ stdlib,我可以使用Cython.我从这篇文章中读到的bitarray并不是那么快gmpy.在gmpy,我不知道如何设置大小.最后,我想知道Python中的内存开销gmpybitarray对象是否值得,当我可以使用时std::bitset,它可能使用最少的内存.

use*_*ica 3

>>> sys.getsizeof(1)
24
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这是24 个字节,只是一个整数。对于 Python 对象,对象开销将淹没如此小的值的所有其他成本。即使你可以削减 10 位(这是你做不到的;内存分配不能那样工作),与引用计数、类型指针和字典条目本身(不包括在 24 位中)相比,这也是微不足道的。数字),甚至在您获取实际数据之前。

bitarray没有帮助;它可能比 int 更大。我不知道std::bitset,因为我不确定 Cython 会增加什么开销,但它会在位计数等方面产生开销。如果有的话,我希望 Cython int 工作得最好,但它可能需要转换为常规 Python int 才能放入字典中。