大多数pythonic方法创建大小为N的字节()具有非零初始值?

时间:2013-01-05 04:09:23

标签: python list python-3.x

我可以做类似

的事情
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倍。

1 个答案:

答案 0 :(得分:5)

创建bytes后,只需进行乘法:

bytes([initialValue])*width