2008-09-23 3 views
12

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

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

+0

только хэдз-ап: короткая ширина C++ не 2 байта. Это зависит от реализации. – user3063349 2017-06-23 15:52:48

+0

Если вы делаете какие-либо манипуляции с этим огромным набором данных, вы, вероятно, захотите использовать [Numpy] (http://numpy.scipy.org/ «Домашняя страница Numpy»), которая поддерживает широкий спектр числовых типов и эффективные операции с массивами из них. – giltay 2008-09-23 13:20:30

ответ

31

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

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

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

+0

Лучший и более полный ответ, чем мой собственный. :) – 2008-09-23 10:45:02

+0

Итак, массив ('h') только с одним элементом, так же как и с созданием короткого целого числа? – Arnav 2008-09-23 10:50:26

5

Благодаря Armin для указывая на модуль 'массив'. Я также нашел «» STRUCT модуль, который упаковывает структуры с стилем в строке:

Из документации (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 
2

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

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

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

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

-1

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

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

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

Смежные вопросы