从内存视图序列创建单字节实例
create single bytes instance from sequence of memoryview
给定 memoryview
的 Sequence
,我如何创建一个 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
在执行期间创建了 bytes
的 len(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())
给定 memoryview
的 Sequence
,我如何创建一个 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
在执行期间创建了 bytes
的 len(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())