【问题标题】:create single bytes instance from sequence of memoryview从 memoryview 序列创建单个字节实例
【发布时间】:2020-10-11 04:17:15
【问题描述】:

鉴于memoryview 中的Sequence,我如何创建单个bytes 实例而不创建中间bytes 实例? em>

天真的方法创建了许多bytes 的中间实例

def create_bytes(seq_mv: Sequence[memoryview]) -> bytes:
    data = bytes()
    for mv in seq_mv:
        data = data + bytes(mv)
    return data

函数create_bytes 在执行期间创建len(seq_mv) + 1bytes 实例。那是低效的。
我希望create_bytes 在执行期间创建一个新的bytes 实例。

【问题讨论】:

标签: python python-3.x performance memory-efficient


【解决方案1】:

bytes 如你所见,是一个不可变对象。

Tim Peters 在 cmets 中提出,您可以让 Python 创建一个实例,将所有部分连接在一起,只需调用 bytes().join(seq_mv)

如果您需要对数据执行任何其他涉及更改方式的操作,您可以改用可变的bytearray - 它不仅让您可以灵活地更改对象,而且具有所有优势可变序列。

如果您的函数的用户不能直接处理字节数组(但也许您可以直接返回它),您可以在函数的末尾进行一次转换为 bytes

def create_bytes(seq_mv: Sequence[memoryview]) -> bytes:
    data = bytearray()
    for mv in seq_mv:
        data.extend(mv)
    return bytes(data)

或者简单地说:

from functools import reduce

data = reduce(lambda data, mv: data.extend(mv), seq_mv, bytearray())

【讨论】:

  • 啊,好好利用reduce!这是一个很好的 extended 答案 ;-) 。确实,join here in the docs。谢谢!
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多