Вы можете просто указать тип данных:
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
И для вашего побочного вопроса, numpy создает намного больше в numpy объекте, чем bitarrray, поэтому он менее эффективен с точки зрения общей памяти объекта.
EDIT:
Память объекта в python состоит из всех методов, реализованных в объекте, по крайней мере, их ссылок на код, атрибуты и элементы, такие как object.size
, который является кортежем numpy, который состоит из целых чисел и т. Д. list, у вас есть несколько ссылок на такие методы, как pop
, delete
и т. д., и он состоит из целых чисел, расположенных в разных узлах (list - это расширенная реализация классического связанного списка, объединенного с другими методами, см. структуры данных в официальных документах).
Учитывая все это, рекомендуется использовать подходящую структуру данных, которая хорошо работает в вашем конвейере, и указывать типы, когда это возможно. Поскольку вы используете numba
, numpy кажется наиболее подходящим. Память не всегда проблема.