我可以做类似的事情
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 倍。