如何复制Python的bytearray缓冲区?

14

我有两个网络缓冲区定义如下:

buffer1 = bytearray(4096)
buffer2 = bytearray(4096)

如何在不分配额外内存的情况下最快地将内容从buffer2移动到buffer1

天真的方法是这样做:

for i in xrange(4096):
    buffer1[i] = buffer2[i]

显然,如果我执行buffer1[:]=buffer2[:],Python会移动内容,但我不完全确定,因为如果我执行:

a = bytearray([0,0,0])
b = bytearray([1,1])
a[:]=b[:]

那么len(a)=2,缺失的字节会发生什么?有人能解释一下这是如何工作的或如何在缓冲区之间移动数据吗?

谢谢。


我认为你在第一段代码中所做的是“将内容从缓冲区2移动到缓冲区1”,而不是反过来。 - jadkik94
1个回答

16

在我的电脑上,以下操作

buffer1[:] = buffer2

复制一个4KB的缓冲区只需要不到400纳秒。换句话说,您每秒可以执行250万次这样的复制操作。

对于您的需求来说,这速度够快吗?

编辑: 如果buffer2buffer1短,并且您想将其内容复制到buffer1中的特定位置而不更改目标缓冲区的其余部分,您可以使用以下方法:

buffer1[pos:pos+len(buffer2)] = buffer2

同样地,您可以在右侧使用切片来只复制 buffer2 的一部分。


在“a=bytearray([0,0,0]);b=bytearray([1,1]);a[:]=b;”这种情况下会发生什么?缺失的字节去哪了? - josgek
@Lluis:嗯,你正在复制一个包含两个字节的缓冲区。因此,结果也包含两个字节。 - NPE
这是我的问题。我不想复制buffer2,而是将其内容移动到buffer1中。 - josgek
谢谢修改。我会使用buffer1[:] = buffer2选项。 - josgek
另一个后续问题:如果我想将buffer2的一部分复制到buffer1中,而不复制buffer2怎么办?假设两个缓冲区都有10个字节长,并且我想将其中一个的前5个字节复制到另一个缓冲区中? - Jack O'Connor
2
啊,显然你可以用memoryview完成这个操作:http://eli.thegreenplace.net/2011/11/28/less-copies-in-python-with-the-buffer-protocol-and-memoryviews - Jack O'Connor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接