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

create single bytes instance from sequence of memoryview

给定 memoryviewSequence,我如何创建一个 bytes 实例 而没有 [=31] =] 创建中间 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 在执行期间创建了 byteslen(seq_mv) + 1 个实例。那是低效的。
我希望 create_bytes 在执行期间创建一个新的 bytes 实例。

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

正如 the Tim Peters 在评论中所说,您可以让 Python 创建一个实例,所有部分通过一次调用 bytes().join(seq_mv).

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

如果您的函数的用户不能直接处理字节数组,那么您可以在函数的末尾对 bytes 进行一次转换(但也许您可以 return直接):

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())