Почему python повторяет байты как целые числа? - PullRequest
0 голосов
/ 04 января 2019

Взято из официальной документации Python :

Поскольку байтовые объекты являются последовательностями целых чисел (сродни кортежу), для байтового объекта b, b [0] будетцелое число, в то время как b [0: 1] будет байтовым объектом длины 1.

Я не совсем понимаю, почему дизайнер выбрал это, поскольку byte это всего лишь 8-бит и int обычно 32-битный.

Может кто-нибудь объяснить причину, по которой b[0] является int?Спасибо!

Редактировать: я пробовал следующий эксперимент:

>>> import sys
>>> b = bytes(100)
>>> sys.getsizeof(b)
133
>>> sys.getsizeof(list(b))
1008

Кажется, что bytes представлен байтами в памяти;но остается вопрос, почему итерацию bytes как int?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

A bytes объект не хранит int s.Индексирование или итерация по объекту bytes приводит к int с, но объект bytes сохраняет байты как байты.Затраты на объект возникают только один раз для всего объекта bytes.

Отдельные байты, извлеченные из объекта bytes, представлены с тем же целочисленным типом, что и любое другое целое число, поскольку нет смысла поступать иначе.Поскольку CPython хранит канонические копии маленьких целых чисел, единственная стоимость хранения байта как обычного int - это стоимость указателя.

Создание выделенного типа byte только для этого все равно будет стоить 16 байтов.накладных расходов на объект byte в стандартной 64-битной сборке CPython, плюс 1 байт для данных, плюс 8 байтов для указателя, для чистой потери 17 байтов по сравнению с простым хранением указателя для int.Конечно, вы можете хранить канонические byte объекты, но это все равно не дает вам никаких преимуществ по сравнению с существующими каноническими int s.Кроме того, тип byte добавил бы дополнительную сложность к коду, который должен взаимодействовать с byte.

. Единственный способ хранить байты с меньшим количеством байтов на байт в модели данных CPython, чем просто использование int, состоит в использованииупакованное представление, и упакованное представление для этого - bytes.

0 голосов
/ 04 января 2019

Байт может быть представлен как int ниже 2 ** 8 или меньше 256. Это для упрощения возможности перетаскивания байтов объекта байта.

Примечание. Когда вы создаете объект байта, онотображает:

bytes(iterable_of_ints) -> bytes

Это означает, что байтовый объект - это всего лишь несколько битов, но он превращен в закодированные байты.

Думайте об байтовом объекте как о списке байтов.Проверьте это:

>>> l = [1, 36, 233]
>>> b = bytes(l)
>>> l[0]
1
>>> b[0]
1
>>> l[0:1]
[1]
>>> b[0:1]
b'\x01'


Теперь о вопросе почему?

Каким другим способом можно представить байт?
A string уверенбудет представлять множество байтов с кодировкой , но не в том случае, если для него задана другая кодировка или не указана кодировка.
A кортеж не будет иметь смысла, поскольку может иметь что-нибудь внутри.Это включает в себя другие строки, числа с плавающей точкой и другие вещи, которые байт не будет представлять.
integer будет представлять только один байт, и кортеж целых чисел специально для этой цели будет работать.

Следовательно, кортеж из int s будет составлять объект bytes, и объект bytes сможет декодироваться и кодироваться в строки для использования.int будет единственным «чистым» способом представления одного байта внутри объекта bytes.

...