python - 是否可以使用非零值有效地初始化 bytearray?

标签 python python-3.x python-bytearray

我需要一个巨大的 bool 数组。所有值都应初始化为“True”:

arr = [True] * (10 ** 9)

但如上创建它占用太多内存。所以我决定为此使用 bytearray:

arr = bytearray(10 ** 9)  # initialized with zeroes

是否有可能用 b'\x01' 初始化 bytearray 和用 b'\x00' 初始化一样有效?

我知道我可以用零初始化 bytearray 并反转我的逻辑。但如果可能的话,我宁愿不这样做。

时间:

>>> from timeit import timeit
>>> def f1():
...   return bytearray(10**9)
... 
>>> def f2():
...   return bytearray(b'\x01'*(10**9))
... 
>>> timeit(f1, number=100)
14.117428014000325
>>> timeit(f2, number=100)
51.42543800899875

最佳答案

简单,使用序列乘法:

arr = bytearray(b'\x01') * 10 ** 9

相同的方法适用于用零进行初始化 (bytearray(b'\x00') * 10 ** 9),并且它通常是首选,因为将整数传递给 bytes 构造函数之前一直是混淆的根源(人们有时认为他们可以用整数值制作单个元素 bytes)。

您想先初始化单个元素bytearray,然后再相乘,而不是将bytes相乘并传递给bytearray构造函数,因此,您可以避免将峰值内存需求加倍(并且需要从一个巨大的数组读取并写入另一个,在任何解决方案都需要的单个数组上的简单 memset 操作之上)。

在我的本地测试中,bytearray(b'\x01') * 10 ** 9 的运行速度与 bytearray(10 ** 9) 一样快;每个循环都花费了大约 164 毫秒,而将 bytes 对象相乘,然后将其传递给 bytearray 构造函数花费了 434 毫秒。

关于python - 是否可以使用非零值有效地初始化 bytearray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40889596/

相关文章:

python - (x,) 在 NumPy 形状中表示什么?

python-3.x - get_dummies 并一起计数

python-3.x - Azure Web 服务部署在本地如何工作?

python - 需要使用 python 替换配置文件中的相似键值

python - 如何实现 readinto() 方法

python - 将字节数组转换为字符串

python - mpz 变量的算术结果是什么?

python - Appengine 上的社交身份验证有哪些不同选项 - 它们如何比较?

python - OFFSET 不能为负