2012-05-17 24 views
6

Ben iki ağ tamponlar olarak tanımlamış:Python bytearray arabelleği nasıl kopyalanır?

ekstra bellek ayırmadan buffer1 için buffer2 içeriği taşımak için en hızlı yoldur
buffer1 = bytearray(4096) 
buffer2 = bytearray(4096) 

?

naif şekilde yapmak olacaktır:

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

Ben buffer1[:]=buffer2[:] piton içeriği taşır yapmak Anlaşılan eğer, ama ben, çünkü eğer bunun% 100 emin değilim:

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

, daha sonra len(a)=2. Eksik baytla ne olur? Bunun nasıl çalıştığını veya arabellekleri arasında veriyi nasıl taşıyacağını açıklayabilir mi?

Teşekkürler. Benim bilgisayarda

+0

Sanırım ilk kodunuzda yaptığınız şey "içeriği buffer2'den buffer1'e taşıyor", tersi değil. – jadkik94

+0

teşekkürler @ jadkik94, düzeltildi. – josgek

cevap

6

, 400 nanosaniye altında

buffer1[:] = buffer2 

kopya 4 KB tampon aşağıdaki. Diğer bir deyişle, saniyede 2,5 milyon kopya çekebilirsiniz.

Bu ihtiyaçlarınız için yeterince hızlı mı?

düzenleme: buffer1 daha kısa olur ve hedef tampon geri kalanını değiştirmeden buffer1belirli bir pozisyonda içeriğini kopyalamak istediğinizbuffer2 varsa, kullanabilirsiniz:

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

Benzer şekilde, buffer2'un bir bölümünü kopyalamak için sağ taraftaki dilimlemeyi kullanabilirsiniz.

+0

"a = bytearray ([0,0,0]); b = bytearray ([1,1]); a [:] = b;" Eksik bayt nereye gider? – josgek

+0

@Lluis: İki bayt içeren bir arabelleğin kopyasını yapıyorsunuz. Sonuç bu nedenle de iki bayt içerir. – NPE

+0

Bu benim problemim. Buffer2'nin bir kopyasını yapmak istemiyorum ama içeriğini buffer1'e taşıyorum. – josgek