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

标签 python list python-3.x

我可以做类似的事情

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/

相关文章:

asp.net-mvc - MVC 3 中可以将模型绑定(bind)到具有非顺序索引的列表吗?

python - 如何使用变量作为标识符输入列表中的项目?

python - numpy.where() 在这个例子中究竟是如何选择元素的?

python - 如何使用 Django 将 View 变量传递给模板

python - 对数据框中的行子集进行连接和求和

python - 在函数中定义用户输入时遇到问题

python - Pandas 在每组中找到满足条件的最大值

c# - 在特定位置后使用 lambda 按字母顺序对列表进行排序

python - 在 Numba 中,如何调用在 GPU 上运行的递归函数?

python-3.x - 将包含集合的数据框列的每一行转换为包含列表的列