我可以做類似大多數使用非零初始值創建大小爲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倍。
究竟是你想實現什麼目標?你的兩個例子都沒有做任何有用的事情。第一個字符串表示一個Python列表,這可能不是你想要的,第二個例子的結果是TypeError:'str'對象不支持項目分配。你知道'bytes'只是'str'的另一個名字嗎? –
它發生在我身上,我們必須談論Python 3.在問題中指定它會很好,因爲它在Python 2中完全不同。示例2仍然無法正常工作,但我認爲您需要'bytearray' 。 –
修復@PhilFrost,謝謝! –