python - 从内存 View 序列创建单字节实例

标签 python python-3.x performance memory-efficient

tl;dr 给定 memoryviewSequence,如何创建单个 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) + 1bytes实例。这是低效的。
我希望 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/

相关文章:

python-3.x - 如何将整列作为参数传递给 tldextract 函数?

python-3.x - 为什么 Python 3 上的 pdb 会忽略我的 CTRL+C 而只显示 "--KeyboardInterrupt--"

python - 当迭代超过 10,000 次时,Tensorflow 训练变得越来越慢。为什么?

python - pandas DataFrames 的字典 x.update(y)?

python - 如何使用冒泡排序在 Python 3 中对列表进行排序和子排序

python - "detail": "Method\"GET\"not allowed." in TokenAuthentication Django rest framework

c# - 从硬盘快速读取

python - 在 mac osx(雪豹)上安装 numpy

python-3.x - 相当于 R 的 "attach"在 Python 中的数据帧?

performance - 使用 CL 寄存器的移位会导致部分寄存器停顿吗?