2016-04-10 4 views
-1

Wenn ich eine Python-Liste (data) und zwei ganzen Zahlen (i und count) kann ich count Kopien von i zu data leicht anhängen:Wie kann ich mehrere Kopien eines Wertes an ein Python-Bytearray anhängen?

>>> data = [0] 
>>> i, count = 1, 4 
>>> data += [i] * count 
>>> data 
[0, 1, 1, 1, 1] 

Wie kann ich das gleiche tun, wenn data ein bytearray ist? Ist es notwendig, zuerst eine Liste zu erstellen, z. data += bytearray([i] * count)?

+1

Haben Sie etwas versucht? Wenn es nicht funktioniert hat, was ist der Code & Fehler? Ich sehe keine 'Bytearrays' im Code, mit denen ich anfange. –

Antwort

2

Ist es notwendig, zuerst eine Liste zu erstellen, z. data += bytearray([i] * count)?

Das ist in der Tat eine Möglichkeit, es zu tun. Sie können auf der Byte-Array der Multiplikationsoperation tun (in Bezug auf die Liste im Gegensatz), die von count * leicht speichereffizienter und viel schneller für große Werte ist:

>>> data = bytearray([0]) 
>>> i, count = 1, 4 
>>> data += bytearray((i,)) * count 
>>> data 
bytearray(b'\x00\x01\x01\x01\x01') 

* Quelle: Funktioniert auf meinem Maschine; YMMV! Versucht mit einem Zählerstand von 4000000000, der beim Multiplizieren der Liste aus dem Speicher ging, aber nicht beim Multiplizieren des Bytearrays. Kleinere Werte von count (600000000) verwenden beim Multiplizieren einer Liste mehr als 8 Mal so viel Speicher wie beim Multiplizieren eines Bytearrays.

2

Wenn es Ihnen nichts ausmacht mit import würde ich vorschlagen itertools.repeat.

>>> from itertools import repeat 
>>> data = bytearray([0]) 
>>> data.extend(repeat(1, 3)) 
>>> data 
bytearray(b'\x00\x01\x01\x01') 
+0

Ich möchte die "schnelle" Behauptung bestreiten - auf meiner Maschine ist es mehr als 27 mal langsamer als naive Multiplikation beim Testen mit 6000000000 Iterationen: http://i.imgur.com/6utNJVc.png Die Lücke scheint sich mit zu verschlechtern größere Zahlen auch, obwohl das wahrscheinlich zum Teil aufgrund Pythons Aufwärmzeit ist, die aus der Gleichung herausgenommen wird. –

+0

@Score_Under, auf kleinen N itertools ist _up_ _to_ :) 40% schneller auf meinem Rechner 'In [32]:% time it s = bytearray(); s.extend (repeat (1, 1000000)) ''
100 Schleifen, am besten von 3: 10,4 ms pro loop' 'In [33]:% timeit bytearray ([1] * 1000000)' ' 100 Schlaufen Das Beste von 3: 15 ms pro Schleife. Bei so großen Zahlen denke ich, dass die Verlangsamung auf die Neuzuordnung von Arrays zurückzuführen ist. – robyschek

+1

Sie müssen das Bytearray und nicht die Liste multiplizieren - die Listenmultiplikation ist wahrscheinlich der am wenigsten effiziente Weg, dies zu tun, weshalb ich mich in meiner Antwort schnell davon entfernt habe. Aus irgendeinem Grund kann ich dich nicht ansprechen, ist das ein Fehler? –

Verwandte Themen