2012-05-17 4 views
6

Я два сетевых буферов определяется как:Как скопировать буфер bytearray python?

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

Какой самый быстрый способ перемещения содержимого из buffer2 в buffer1 без выделения дополнительной памяти?

Наивный способ был бы сделать:

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

Видимо, если я buffer1[:]=buffer2[:] питон перемещает содержимое, но я не 100% уверен в этом, потому что, если я делаю:

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

затем len(a)=2. Что происходит с отсутствующим байтом? Может ли кто-нибудь объяснить, как это работает или как перемещать данные между буферами?

Спасибо.

+0

Я думаю, что вы делаете в своем первом коде «переместить содержимое из буфера2 в buffer1», а не наоборот. – jadkik94

+0

спасибо @ jadkik94, исправлено. – josgek

ответ

6

На моем компьютере, следующий

buffer1[:] = buffer2 

копирует 4KB буфера в менее 400 наносекунд. Другими словами, вы можете сделать 2,5 миллиона таких копий в секунду.

Это достаточно быстро для ваших нужд?

редактировать: Если buffer2 короче buffer1, и вы хотите, чтобы скопировать его содержимое в определенном положении в buffer1без изменения остальной части целевого буфера, вы можете использовать следующее:

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

Аналогичным образом вы можете использовать нарезку с правой стороны, чтобы копировать только часть buffer2.

+0

Что произойдет тогда в случае, когда «a = bytearray ([0,0,0]); b = bytearray ([1,1]); a [:] = b;" Где идет пропавший байт? – josgek

+0

@Lluis: Ну, вы делаете копию буфера, содержащего два байта. Поэтому результат также содержит два байта. – NPE

+0

Это моя проблема. Я не хочу делать копию buffer2, но перемещаю его содержимое в buffer1. – josgek

Смежные вопросы