2013-01-05 34 views
2

我可以做類似大多數使用非零初始值創建大小爲N的字節()的pythonic方法?

initialValue = 0x42 
width = 113 
someBytes = bytes([initialValue] * width) 

這浪費時間創建中間的列表只是雖然把它扔掉。

someBytes = bytearray(width) 
for n in range(width): 
    someBytes[n] = initialValue 

但是,這是高度非功能性,並與初始值爲零,這將只是立即更換開始,我需要使用的分配工作的ByteArray。

是否有更多的Python /簡單/簡潔的方式來實現這一目標?

(python3 BTW)

追問:

我結束了使用bytes([initialValue]) * width方法。我認爲唯一不「明顯的」是需要使用短命狀態的常規列表來創建一個具有初始值的字節數組,但這與寬度分配無關,並且與其他一些python集合。

我做了一些有趣的時機。人們會期望延伸的字節比從延伸列表創建的字節更快。

>>> timeit("bytes([initial]) * width", 
... "width = 256; initial = 0x42", number=100000) 
0.11861954815685749 

VS

>>> timeit("bytes([initial] * width)", 
... "width = 256; initial = 0x42", number=100000) 
0.5535310138948262 

由於width規模上升,差異變得越來越明顯。我嘗試的另一個有趣的方法是使用對創作的理解。我很驚訝,它是多麼緩慢,這是:

>>> timeit("bytes(initial for _ in range(width))", 
... "width = 256; initial = 0x42", number=100000) 
2.3924577180296183 

隨着寬度的增加,這一個真正蔓延遠離原來的。由於我的initialValue是以編程方式確定的,所以我不能使用這種方法,但其速度實際上相當快,這讓我感到很意外,從列表創建一個元素字節的開銷非常大:

>>> timeit("b'\x42' * width", 
... "width = 256; initial = 0x42", number=100000) 
0.010320456698536873 

這比完全快速但非文字的解決方案完全快10倍。

+0

究竟是你想實現什麼目標?你的兩個例子都沒有做任何有用的事情。第一個字符串表示一個Python列表,這可能不是你想要的,第二個例子的結果是TypeError:'str'對象不支持項目分配。你知道'bytes'只是'str'的​​另一個名字嗎? –

+0

它發生在我身上,我們必須談論Python 3.在問題中指定它會很好,因爲它在Python 2中完全不同。示例2仍然無法正常工作,但我認爲您需要'bytearray' 。 –

+0

修復@PhilFrost,謝謝! –

回答

5

只是做乘法創建後bytes

bytes([initialValue])*width 
+1

只要'b'\ x42'* 113'如果它只是一個常量。 –

相關問題