用非零初始值创建大小为N的bytes()的大多数python方法?

2024-09-27 23:26:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以做些像

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

不过,这会浪费时间创建一个中间列表来丢弃它。在

或者

^{pr2}$

但是这是非常不起作用的,并且从初始值0开始,它将立即被替换,我需要使用bytearray来执行赋值。在

有没有一种更python/simple/terse的方法来实现这一点?在

(Python3 btw)

跟进:

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

我确实做了一些有趣的计时。人们会认为拉伸的字节比从拉伸列表创建的字节要快。在

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


Tags: 方法number列表字节bytes宽度widthinitial

热门问题