从内存视图序列创建单字节实例

问题描述 投票:0回答:1

tl;dr 给定

Sequence
memoryview
,如何创建单个
bytes
实例 without 创建中间
bytes
实例?

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

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) + 1
bytes
的实例。那是低效的。
我想要
create_bytes
在执行期间创建 one 新的
bytes
实例。

python python-3.x performance memory-efficient
1个回答
2
投票

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

正如 the Tim Peters 在评论中所说,您可以让 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())
© www.soinside.com 2019 - 2024. All rights reserved.