tl;dr 给定 memoryview
的 Sequence
,如何创建单个 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
在执行期间创建一个新的bytes
实例。
最佳答案
bytes
正如你所得到的,它是一个不可变的对象。
正如 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())
关于python - 从内存 View 序列创建单字节实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64300550/