我需要一个巨大的 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/