Лучший битовый массив для Numba - PullRequest
0 голосов
/ 18 ноября 2018

Мне нужно создать битовый массив в Python.До сих пор я обнаружил, что с помощью модуля bitarray можно генерировать массивы с очень высокой эффективностью памяти.

Однако мое последнее намерение - использовать декоратор @vectorize из Numba.Numba работает только с ограниченным количеством Python и numpy функций, и Bitarray не является одной из них.

Мой вопрос заключается в том, каков наилучший способ экономии памяти?создание битовых массивов с использованием структур, которые поддерживаются Numba ?

Я бы пошел с массивными массивами, но я сделал быстрый тест памяти, и он не выглядит хорошо:

>>> 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

(не говоря уже о list)


РЕДАКТИРОВАТЬ: В качестве дополнительного вопроса, есть ли у кого-нибудь идеи, почему getsizeof возвращает такое нереально низкое число для bitarray?Я только что заметил.

1 Ответ

0 голосов
/ 18 ноября 2018

Вы можете просто указать тип данных:

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 кажется наиболее подходящим. Память не всегда проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...