从memoryview序列创建单字节实例

问题描述

给定Sequence中的memoryview,如何创建单个bytes实例而没有创建中间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的{​​{1}}个实例。那是低效率的。
我希望bytes在执行期间创建一个新的create_bytes实例。

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...