2

我可以做类似的事情

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

这会浪费时间创建一个中间列表,只是为了把它扔掉。

或者

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

但这是非常不起作用的,并且从初始值零开始,它将立即被替换,我需要使用字节数组来进行分配。

有没有更python/simple/terse的方法来完成这个?

(python3顺便说一句)

跟进:

我最终使用了这种bytes([initialValue]) * width方法。我认为唯一“不太明显”的是需要使用常规的短期状态列表来创建具有初始值的字节数组,但这与宽度分配无关,并且与其他一些一致蟒蛇集合。

我确实做了一些有趣的时间安排。人们会期望拉伸字节比从拉伸列表创建的字节快。

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

对比

>>> 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 倍。

4

1 回答 1

5

只需在创建后进行乘法bytes

bytes([initialValue])*width
于 2013-01-05T04:15:12.463 回答