gpt4 book ai didi

Python:截断字节缓冲区时的零复制

转载 作者:太空宇宙 更新时间:2023-11-03 18:16:29 25 4
gpt4 key购买 nike

这是一个有关 Python 的菜鸟问题。

Python 中是否有一种方法可以从 bytearray 开头截断几个字节并实现此目的,而无需将内容复制到另一个内存位置?以下是我正在做的事情:

inbuffer = bytearray()
inbuffer.extend(someincomingbytedata)
x = inbuffer[0:10]
del inbuffer[0:10]

我需要保留截断的字节(由x引用)并对其执行一些操作。

x 是否会指向与 inbuffer[0] 相同的内存位置,或者上述代码中的第 3 行会复制数据。另外,如果不复制,删除最后一行是否也会删除x引用的数据?由于 x 仍在引用该数据,因此 GC 不应回收它。是这样吗?

编辑:

如果这不是截断字节缓冲区并返回截断的字节而不进行复制的正确方法,是否有其他类型安全地支持此类操作?

最佳答案

在您的示例中,x 将是一个新对象,其中包含 inbuffer[0:10] 内容的副本

要获得不复制的表示,您需要使用内存 View (仅在 Python 3 中可用):

inbuffer_view = memoryview(inbuffer)
prefix = inbuffer_view[0:10]
suffix = inbuffer_view[10:]

现在prefix将指向inbuffer的前10个字节,suffix将指向inbuffer<的剩余内容。这两个对象都保留对 inbuffer 的内部引用,因此您无需显式保留对 inbufferinbuffer_view 的引用。

请注意,前缀后缀都将是内存 View ,而不是字节数组或字节。您可以从中创建字节和字节数组,但此时内容将被复制。

内存 View 可以传递给任何与实现缓冲区协议(protocol)的对象一起使用的函数。因此,例如,您可以使用 fh.write(suffix) 将它们直接写入文件。

关于Python:截断字节缓冲区时的零复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24929580/

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