【问题标题】:Does `bytearray` not contradict the Zen of Python?`bytearray` 与 Python 的禅意不矛盾吗?
【发布时间】:2016-05-16 22:02:02
【问题描述】:

Python PEP 3137 引入了 bytearray 作为一个可变的 8 位数组类型。然而,不可变的bytes 类型的list 实现了相同的目标,并且实际上具有better performance,尽管语法可能更笨拙。这种新类型与Zen of Python 相矛盾

应该有一种——最好只有一种——明显的方法。

所以我的问题是:与byteslist 相比,使用bytearray 是否有任何记录的主要优势或设计考虑因素?

到目前为止,我还没有发现 PEP 或文档页面中记录的动机。事实上,文档将它们视为几乎相等:

bytearray 类型是 0

然后,

List 和 bytearray 对象支持允许就地修改对象的附加操作。其他可变序列类型(当添加到语言中时)也应该支持这些操作。

由于bytearrays 是静态类型的(作为 8 位无符号整数),人们可能会期望性能会有所提高,但如上所述,反之亦然。此外,bytearraybyteslist 相比,应该没有内存优势。我可以想象需要 itertools.chain 风格的可变类型,但这在任何地方都没有提到,似乎也不是设计目标。

【问题讨论】:

  • 字节数组可以做列表不能做的事情
  • 如果您关心性能,您可能应该使用 NumPy。
  • 另外,我觉得这很可疑:“另外,对于字节列表,字节数组应该没有内存优势。” list 将包含对每个 bytes 值的引用(4 或 8 个字节,具体取决于平台),该值存储在其他位置。 bytearray 每个值将使用 1 个字节。这应该可以节省大量内存。
  • 你见过the interface supported by bytearray吗?它与通用的list 完全不同。您可能会问,如果我们可以将字节放入tuple,为什么会存在bytesbytearray 是可变的字节序列。 bytes 是一个不可变的字节序列。
  • @kindall - bytearray 可能应该被实现为非连续内存;否则每次调用extend() 时都会遭受重新分配,然后我们不妨将bytes 连接在一起。

标签: python python-3.x bytearray


【解决方案1】:

首先,一个list 风格的容器可以无缝地遍历它们的对象序列(实际上是itertools.chain 提供的东西)绝对看起来很方便。正如PEP 3137 所提到的,array module 可能已用于此目的,但“远非理想”。

作者希望“既可变又不可变的字节类型”,这可能意味着设计目标是为可变和不可变的字节类型提供相同的接口(可能使用非连续内存进行快速插入和删除),以及作为不可变(绝对连续的内存)实现。据我所知,这创建了一系列序列类型,包括array.arraybytesbytearraystrunicodelisttuplegenerator。从本质上讲,它们为静态类型或闪避类型、可变或不可变序列提供接口,这些序列存储在内存中或动态评估(生成器)。其中大部分确实遵循Abstract Base Classes 的基本原理,但我确实认为在这被视为 Pythonic 之前还有更多的设计工作要做。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多