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

Tra*_*ggs 2 python list python-3.x

我可以做点什么

initialValue = 0x42
width = 113
someBytes = bytes([initialValue] * width)
Run Code Online (Sandbox Code Playgroud)

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

要么

someBytes = bytearray(width)
for n in range(width):
  someBytes[n] = initialValue
Run Code Online (Sandbox Code Playgroud)

但是这是非常不起作用的,并且以零的初始值开始,这将立即被替换,并且我需要使用bytearray来使分配工作.

是否有更多python /简单/简洁的方法来实现这一目标?

(python3顺便说一句)

跟进:

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

我确实做了一些有趣的时机.可以预期,拉伸的字节比从拉伸列表创建的字节更快.

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

VS

>>> timeit("bytes([initial] * width)",
...   "width = 256; initial = 0x42", number=100000)
0.5535310138948262
Run Code Online (Sandbox Code Playgroud)

随着大小的width增加,差异变得越来越明显.我尝试的另一种有趣的方法是使用理解来创造.我很惊讶这是多么缓慢:

>>> timeit("bytes(initial for _ in range(width))",
...   "width = 256; initial = 0x42", number=100000)
2.3924577180296183
Run Code Online (Sandbox Code Playgroud)

随着宽度的增加,这个距离原来很远.由于我的initialValue是以编程方式确定的,所以我无法使用该方法,但它的速度实际上非常快,这让我感到惊讶,从列表创建一个元素字节的开销非常大:

>>> timeit("b'\x42' * width",
...   "width = 256; initial = 0x42", number=100000)
0.010320456698536873
Run Code Online (Sandbox Code Playgroud)

这比其他快速但非文字的解决方案快10倍.

Bre*_*arn 5

只需在创建后执行乘法bytes:

bytes([initialValue])*width
Run Code Online (Sandbox Code Playgroud)