Ответ 1
Неа. Но вы можете использовать короткие целые числа в массивах:
from array import array
a = array("h") # h = signed short, H = unsigned short
Пока значение остается в этом массиве, оно будет коротким целым.
- для модуля
Python автоматически выделяет целые числа на основе базовой системной архитектуры. К сожалению, у меня есть огромный набор данных, который необходимо полностью загрузить в память.
Итак, есть ли способ заставить Python использовать только 2 байта для некоторых целых чисел (эквивалент С++ "short" )?
Неа. Но вы можете использовать короткие целые числа в массивах:
from array import array
a = array("h") # h = signed short, H = unsigned short
Пока значение остается в этом массиве, оно будет коротким целым.
Благодаря 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
Предположение Армина о модуле массива, вероятно, лучше всего. Две возможные альтернативы:
Также стоит осознать, что целочисленный объект Python не имеет 4 байта - есть дополнительные накладные расходы. Поэтому, если у вас действительно очень много коротких замыканий, вы можете сохранить более двух байтов на число с помощью короткого кода C (например, модуля массива).
Мне пришлось хранить большой набор целых чисел в памяти некоторое время назад, а словарь с целыми ключами и значениями был слишком большим (у меня было 1 ГБ для структуры данных IIRC). Я переключился на использование IIBTree (от ZODB) и сумел подогнать его. (Ints в IIBTree являются реальными C ints, а не целыми числами Python, и я взломал автоматический переключатель в IOBTree, когда число было больше 32 бит).
@Armin: как получилось? Документация Python говорит, что минимальный размер для этого массива короткого целого составляет 2 байта и
Фактическое представление значений определяемый машинной архитектурой (строго говоря, С реализация). Фактический размер может доступ через элементы атрибут.
@Arnav: я предлагаю, чтобы ваш код должен проверять размер каждого кода типа и выбирать соответствующий 2-байтовый тип, который относится к базовой системе.