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
实例。
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())