Экономия памяти на dict с помощью bitarray вместо int?

Я пытаюсь уменьшить потребление памяти Python dict, который в моем случае служит word-->document_id «перевернутый индекс». каждый word хешируется как целое число, которое занимает 24 байта.

Мне было интересно, могу ли я преобразовать каждый элемент в dictи каждый ключ в пределах dict вместо битрейра. Я заметил, что максимальное значение любого встреченного int меньше чем 2^22Так что я могу просто выделить битовый массив размером 22.

Как это может быть сделано? До сих пор я видел gmpy2 а также bitarray библиотеки, а также std::bitset в C ++ stdlib, который я могу использовать с Cython. Я прочитал из этого сообщение тот bitarray не так быстро, как gmpy, В gmpyЯ не уверен, как установить размер. Наконец, мне интересно, gmpy или же bitarray объекты в Python стоят того, когда я могу просто использовать std::bitset, который, вероятно, использует меньше всего памяти.

5

Решение

>>> sys.getsizeof(1)
24

Это 24 байта, только для целого числа, на моей машине. Для объектов Python накладные расходы на объекты сократят все другие затраты для таких малых значений. Даже если бы вы могли сбрить 10 бит (что не может; выделение памяти не работает таким образом), это арахис по сравнению с refcount, указателем типа и самой записью dict (которая не включена в эти 24 номер), даже прежде чем вы получите к фактическим данным.

bitarray не собирается помогать; это, вероятно, больше, чем int. Я не знаю о std::bitset, так как я не уверен, что Cython добавляет к нему служебную информацию, но он будет иметь издержки для таких вещей, как подсчет битов. Во всяком случае, я ожидал бы, что Cython int будет работать лучше, но, вероятно, его нужно преобразовать в обычный Python int, чтобы вступить в противоречие.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]