Подтвердить что ты не робот

Короткие целые числа в Python

Python автоматически выделяет целые числа на основе базовой системной архитектуры. К сожалению, у меня есть огромный набор данных, который необходимо полностью загрузить в память.

Итак, есть ли способ заставить Python использовать только 2 байта для некоторых целых чисел (эквивалент С++ "short" )?

4b9b3361

Ответ 1

Неа. Но вы можете использовать короткие целые числа в массивах:

from array import array
a = array("h") # h = signed short, H = unsigned short

Пока значение остается в этом массиве, оно будет коротким целым.

  • для модуля

Ответ 2

Благодаря Armin для указания модуля "массив". Я также нашел модуль "struct", который компонует структуры c-style в строке:

Из документации (https://docs.python.org/library/struct.html):

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

Ответ 3

Предположение Армина о модуле массива, вероятно, лучше всего. Две возможные альтернативы:

  • Вы можете самостоятельно создать модуль расширения, который предоставит вам структуру данных. Если это действительно что-то вроде коллекции шорт, тогда это довольно просто сделать.
  • Вы можете чит и манипулировать битами, так что вы сохраняете одно число в нижней половине Python int и другой в верхней половине. Вы должны написать некоторые служебные функции конвертировать в/из этих структура данных. Ужасно, но его можно заставить работать.

Также стоит осознать, что целочисленный объект Python не имеет 4 байта - есть дополнительные накладные расходы. Поэтому, если у вас действительно очень много коротких замыканий, вы можете сохранить более двух байтов на число с помощью короткого кода C (например, модуля массива).

Мне пришлось хранить большой набор целых чисел в памяти некоторое время назад, а словарь с целыми ключами и значениями был слишком большим (у меня было 1 ГБ для структуры данных IIRC). Я переключился на использование IIBTree (от ZODB) и сумел подогнать его. (Ints в IIBTree являются реальными C ints, а не целыми числами Python, и я взломал автоматический переключатель в IOBTree, когда число было больше 32 бит).

Ответ 4

@Armin: как получилось? Документация Python говорит, что минимальный размер для этого массива короткого целого составляет 2 байта и

Фактическое представление значений определяемый машинной архитектурой (строго говоря, С реализация). Фактический размер может доступ через элементы атрибут.

@Arnav: я предлагаю, чтобы ваш код должен проверять размер каждого кода типа и выбирать соответствующий 2-байтовый тип, который относится к базовой системе.