2016-05-16 84 views
0

Python PEP 3137介绍bytearray作为一个可变的8位数组类型。然而,不可变的bytes类型的list实现相同的目标,并且实际上具有betterperformance,虽然也许是更笨拙的语法。这种新类型与Zen of Python`bytearray`是否与Python的Zen不矛盾?

应该有一个 - 最好只有一个 - 明显的方法来做到这一点。

所以我的问题是:是否有任何记录主要优势和设计考虑使用bytes一个bytearraylist

到目前为止,我还没有发现在PEP或文档页面中记录的一个动机。事实上,该文档将它们视为接近等于:

的ByteArray类型是整数的范围为0 < = X < 256.一个可变的序列,具有大部分可变序列的常规方法...

然后,

列表和ByteArray对象支持额外的操作,使对象的就地修改。其他可变序列类型(添加到语言中时)也应该支持这些操作。

由于bytearray s的静态类型(如8位无符号整数),人们可能预期的性能提升,但逆上面提到的可能是真实的。此外,bytearraybyteslist应该没有记忆优势。我可以想象,需要一个itertools.chain风格的可变类型,但这在任何地方都没有提及,似乎并不是设计目标。

+0

一个bytearray可以做一个列表不能做的事 –

+1

如果你关心性能,你应该使用NumPy。 – kindall

+0

另外,我觉得这个可疑:“另外,字节列表上的字节阵列应该没有内存优势。”一个'list'将包含一个引用(4或8个字节,取决于平台)到每个'bytes'值,该值存储在别处。一个'bytearray'将会每个值恰好使用1个字节。这应该是一个重大的内存节省。 – kindall

回答

0

首先,一个list类型的容器可以无缝遍历它们(实际上itertools.chain提供的东西)的对象序列绝对看起来很方便。由于PEP 3137提到,array module可能为此目的服务,但“远非理想”。

作者希望“既是可变的也是不可变的字节类型”,这可能意味着设计目标对于可变(可能使用非连续内存用于快速插入和删除)具有相同的接口,如以及不可变的(绝对连续的内存)实现。就我可以理解,这产生了一系列序列类型,包括array.array,bytes,bytearray,str,unicode, list,tuplegenerator。实质上,它们提供了静态类型或鸭式类型的接口,可变或不可变序列存储在内存中或即时评估(生成器)。其中大部分都遵循Abstract Base Classes的理论基础,但我认为在可以认为Pythonic之前还有更多的设计需要完成。

注意:我将此答案打开进行编辑,希望人们可以提供见解或更正。