2015-12-29 4 views
2

Очевидно, что целые числа стоят 24 байта в Python. Я могу понять, что он делает это из-за дополнительных колоколов и свиста, представляющих неограниченное число. Однако похоже, что логические типы данных также стоят 24 байта, даже если они могут представлять только два значения. Зачем?Python boolean byte size

Редактировать: Я не прошу лучшего способа хранения bools. Я уже знаю NumPy, BitArray и т. Д. Из других ответов. Мой вопрос: почему, а не как. Чтобы быть ясным и сосредоточенным, я снял вторую часть вопроса.

+2

1. Поскольку булевы являются целыми подклассами. 2. Нет, если вам интересно, что Python может быть недостаточно низким для вас (или вам нужно использовать с ним что-то вроде «numpy»). – jonrsharpe

+1

использовать ctypes, я думаю ... но действительно, если вы беспокоитесь об этом, возможно, это не правильный выбор языка для этого конкретного проекта ... –

+0

«Я понимаю, что это происходит из-за дополнительных колоколов и свиста представления неограниченного число "- нет. Это материал, как указатель типа и счетчик ссылок. На Python 2, 'long', действительный тип bignum, имеет даже * большие * экземпляры. – user2357112

ответ

2

A bool может быть довольно огромным для того, что он представляет, но есть только два из них. Список, полный True s содержит только 4- или 8-байтовые ссылки на один канонический объект True.

Если 8 байтов по-прежнему слишком большие, и вы действительно хотите использовать Python для того, что бы вы ни делали, вы можете использовать тип массива, подобный встроенному модулю array или NumPy. Они предлагают 1-байтовое представление. Если этого все еще слишком много, вы можете использовать битрейт, либо вручную с встроенными бингомами Python, либо с чем-то вроде BitVector из PyPI. Эти параметры, вероятно, замедляют работу программы. Некоторые из них могут предлагать улучшения скорости, но только если вы воспользуетесь функциями, которые позволят вам вывести работу из интерпретируемого кода и в C.

+0

Я знаю альтернативы использования NumPy, BitVector и т. Д. Я пытаюсь понять внутренние рассуждения, которые дизайнеры Python использовали для того, чтобы boolean занимал 24 байта. Большинство вещей в Python очень хорошо продуманы, но это ... – ShitalShah

+2

@ShitalShah: Если ваша программа так нажата на место, что вам нужно беспокоиться о 48 байтах, потребляемых 'True' и' False', вы вероятно, не работает на машине с операционной системой, не говоря уже о интерпретаторе Python. – user2357112

+0

@ShitalShah снова, если вы беспокоитесь об этом, * прекратите использовать Python! * Существует много языков нижнего уровня, если вы хотите сделать такую ​​микро-оптимизацию; это не цель дизайна для Python. – jonrsharpe