如何解决从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())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。