gpt4 book ai didi

Python 3 - 非复制流接口(interface)到 bytearray?

转载 作者:太空狗 更新时间:2023-10-29 20:20:37 28 4
gpt4 key购买 nike

我从某处读取数据缓冲区到 bytearray。现在,我想使用类似流的界面(即 readseek 等)来处理这些数据

我可以用 io.BytesIO 包装我的 bytearray 吗?

mybytearray = bytearray(...)
stream = io.BytesIO(mybytearray)

我担心的是 BytesIO 复制 mybytearray 的数据,但我不想要它 - 因为缓冲区非常大。我不想要副本,我希望流能够处理原始数据并且也可以修改它。可以做什么?

最佳答案

BytesIO 管理自己的内存并将复制用于初始化它的缓冲区。您可以将您的 bytearray 封装在一个类似文件的类中。或者您可以采用另一种方式,让 BytesIO 对象处理内存分配。然后你可以得到一个缓冲区的 View ,可以通过索引和切片修改,但是当 View 存在时你不能重新调整缓冲区的大小:

>>> f = io.BytesIO(b'abc')
>>> view = f.getbuffer()

>>> view[:] = b'def'
>>> f.getvalue()
b'def'

>>> view[3] = b'g'
IndexError: index out of bounds

>>> f.seek(0, 2)
>>> f.write(b'g')
BufferError: Existing exports of data: object cannot be re-sized

>>> del view
>>> f.write(b'g')
>>> f.getvalue()
b'defg'

编辑:

参见 issue 22003 , BytesIO 写时复制。最新补丁 (cow6) 仅支持 bytes 的写时复制。

关于Python 3 - 非复制流接口(interface)到 bytearray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8237122/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com