2016-05-16 1 views
0

Python PEP 3137 представил bytearray в качестве изменяемого 8-разрядного типа массива. Тем не менее, list неизменяемого типа bytes выполняет тот же самый гол и фактически имеет betterperformance, хотя, возможно, и clunkier синтаксис. Этот новый тип противоречит Zen of Python«Bytearray» не противоречит дзену Питона?

Должен быть один - и желательно только один - простой способ сделать это.

Так что мой вопрос: есть ли какое-либо документально главное преимущество или дизайн рассмотрение для использования bytearray больше list из bytes?

До сих пор я не нашел мотивации, задокументированной в PEP или на страницах документации. На самом деле, документация рассматривает их как почти равно:

Типа ByteArray является изменяемой последовательностью целых чисел в диапазоне от 0 < = х < 256. Она имеет большинство обычных методов изменяемых последовательностей ...

а потом,

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

Как bytearray с статически напечатал (как 8-битные целые числа без знака) можно было бы ожидать увеличение производительности, но, как упоминалось выше, обратное, вероятно, справедливо. Кроме того, не должно быть преимущества памяти для bytearray по сравнению с list от bytes. Я мог представить себе, что существует необходимость в типе, изменяемом типами itertools.chain, но это нигде не упоминается и, похоже, не является целью дизайна.

+0

Bytearray может делать то, что список не может –

+1

Если вас беспокоит производительность, вероятно, вы должны использовать NumPy. – kindall

+0

Кроме того, я нахожу это сомнительным: «Кроме того, не должно быть преимущества памяти для байтарей над списком байтов». «Список» будет содержать ссылку (4 или 8 байт в зависимости от платформы) каждому значению 'bytes', которое хранится в другом месте. «Bytearray» будет использовать ровно 1 байт за значение. Это должно быть значительная экономия памяти. – kindall

ответ

0

Во-первых, a list -образный контейнер для последовательностей объектов, которые могут легко проходить через них (что-то, что itertools.chain обеспечивает, на самом деле) определенно кажется удобным. Как упоминалось в PEP 3137, array module, возможно, служил для этой цели, но был «далек от идеала».

Авторы пожелали «как изменяемого, так и неизменяемого типа байтов», что может означать, что цель дизайна имела тот же интерфейс для изменяемого (возможно, с использованием несмежной памяти для быстрых вставок и удалений), так как а также непреложная (определенно непрерывная память) реализация. Это создало, насколько я могу оценить, нагромождение типов последовательностей, в том числе array.array, bytes, bytearray, str, unicode, list, tuple и generator. По сути, они предоставляют интерфейсы для статически типизированных или утиных типов, изменяемых или не подлежащих воспроизведению последовательностей, которые хранятся в памяти или оцениваются «на лету» (генераторы). Большинство из них следуют логике Abstract Base Classes, но я думаю, что есть еще больше дизайна, чтобы это можно было считать Pythonic.

Примечание: Я оставляю этот ответ открытым для редактирования, надеясь, что люди могут внести вклад в понимание или исправления.