我可以做类似的事情
initialValue = 0x42
width = 113
someBytes = bytes([initialValue] * width)
虽然创建一个中间列表只是为了将其丢弃是浪费时间。
或
someBytes = bytearray(width)
for n in range(width):
someBytes[n] = initialValue
但这是非常不实用的,并且以零初始值开始,它会立即被替换,我需要使用字节数组来进行分配。
是否有更 python/简单/简洁的方法来完成此任务?
(python3 顺便说一句)
跟进:
我最终使用了 bytes([initialValue]) * width
方法。我认为唯一“不太明显”的是需要使用常规的短暂状态列表来创建具有初始值的字节数组,但这与宽度分配无关,并且与其他一些一致python 集合。
我确实做了一些有趣的计时。人们会期望拉伸(stretch)字节比从拉伸(stretch)列表创建的字节更快。
>>> 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 倍。
最佳答案
在创建bytes
之后做乘法:
bytes([initialValue])*width
关于python - 使用非零初始值创建大小为 N 的 bytes() 的大多数 pythonic 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168490/