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

标签 python stream python-3.x bytearray

我从某处读取数据缓冲区到 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/

相关文章:

python - 如何从 PyQt5 中的第二个文件访问第一个文件方法?

python - 为什么 contextmanager 很慢

python - 与 Pandas 合并后设置索引?

Node.js 将流复制到文件中而不消耗

python - 如何调试由第三方应用程序启动的 python 脚本

python - Python中的稀疏3d矩阵/数组?

java - 如何关闭 Java Stream?

python - 如何在后台运行进程并覆盖标准流

python - 如何在 python 中向量化包含 eigvalsh 的复杂代码

python-3.x - Eager Execution,tf.GradientTape 只返回 None