Python Numba的最佳可能位阵列

Python Numba的最佳可能位阵列,python,numpy,numba,memory-efficient,bitarray,Python,Numpy,Numba,Memory Efficient,Bitarray,我需要用Python创建一个位数组。到目前为止,我发现使用该模块可以生成非常节省内存的阵列 然而,我的最终目的是使用来自的@vectorize装饰器。Numba只使用有限数量的和功能,而bitarray不是其中之一 我的问题是,使用Numba支持的结构创建位数组的最佳内存效率方法是什么 我会选择numpy阵列,但我做了一个快速内存测试,结果不太理想: >>> import numpy as np >>> import random >>> f

我需要用Python创建一个位数组。到目前为止,我发现使用该模块可以生成非常节省内存的阵列

然而,我的最终目的是使用来自的
@vectorize
装饰器。Numba只使用有限数量的和功能,而bitarray不是其中之一

我的问题是,使用Numba支持的结构创建位数组的最佳内存效率方法是什么

我会选择numpy阵列,但我做了一个快速内存测试,结果不太理想:

>>> import numpy as np
>>> import random
>>> from bitarray import bitarray
>>> from sys import getsizeof
>>> N = 10000

>>> a = bitarray(N)
>>> print(type(a), getsizeof(a))
<class 'bitarray.bitarray'> 96

>>> b = np.random.randint(0, 1, N)
>>> print(type(b), b.nbytes)
<class 'numpy.ndarray'> 40000

>>> c = [random.randint(0, 1) for i in range(N)]
>>> print(type(c), getsizeof(c))
<class 'list'> 87624
>>将numpy作为np导入
>>>随机输入
>>>从bitarray导入bitarray
>>>从sys导入getsizeof
>>>N=10000
>>>a=位数组(N)
>>>打印(类型(a),获取大小(a))
96
>>>b=np.random.randint(0,1,N)
>>>打印(类型(b),b.N字节)
40000
>>>c=[random.randint(0,1)表示范围(N)中的i]
>>>打印(类型(c),尺寸(c))
87624
(更不用说
列表了



编辑:作为一个附带问题,有人知道为什么
getsizeof
bitarray
返回如此低的值吗?我刚刚注意到。

您可以简单地指定数据类型:

N=1000
b = np.random.randint(0, 1, N)
print(type(b),getsizeof(b))
<class 'numpy.ndarray'> 4096
c = np.random.randint(0, 1, N, dtype=np.bool)
print(type(b),getsizeof(c))
<class 'numpy.ndarray'> 1096
N=1000
b=np.random.randint(0,1,N)
打印(类型(b),获取大小(b))
4096
c=np.random.randint(0,1,N,dtype=np.bool)
打印(类型(b),尺寸(c))
1096
至于你的附带问题,numpy在numpy对象中构造的比bitarray多得多,所以它在对象的总内存方面效率较低

编辑:

python中对象的内存由对象中实现的所有方法组成,至少它们对代码、属性和项的引用,如
object.size
,它是一个numpy元组,由整数等组成。在列表中,您对方法有多个引用,如
pop
delete
,等等。,它由排列在不同节点上的整数组成(列表是经典链表与其他方法相结合的扩展实现,见官方文档)


考虑到所有这些因素,最佳实践是使用在管道中运行良好的适当数据结构,并尽可能指定类型。因为您使用的是
numba
,所以numpy似乎最适合您。内存并不总是问题所在。

我想知道这是否完全正确。至少“布尔值表示为字节”(即非位)的状态。我认为在您的示例中,我们看到的差异是
np.int32
np.int8
之间的差异。另见。