问题描述
给定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())