Skip to main content
 首页 » 编程设计

python之如何快速将 Python bytearray 设置为 0

2025年05月04日15webabcd

当创建一个 Python 字节数组(传递给它一个整数)时,它会创建一个包含那么多字节的字节数组,并将它们全部设置为零。

我想清除 bytearray,它可能非常大,迭代它并将内容设置为零的方式非常糟糕。

有没有更好的方法?

(memoryviews 和 bytearrays 在 IMO 中的记录很差)

迄今为止最好的资源(但没有一个能回答我的问题)

http://docs.python.org/dev/library/stdtypes.html#bytes-methods

http://docs.python.org/dev/library/functions.html#bytearray

请您参考如下方法:

为什么你认为重新分配字节数组这么慢?它比使用 translate 或大字节数组快 10 倍以上!

我正在删除原来的bytearray,所以你不必担心临时使用双倍的内存

# For small bytearray reallocation is a tiny bit faster 
 
$ python -m timeit -s "s=bytearray('Hello World')" "s.translate('\0'*256)" 
1000000 loops, best of 3: 0.672 usec per loop 
$ python -m timeit -s "s=bytearray('Hello World')" "lens=len(s);del s;s=bytearray(lens)" 
1000000 loops, best of 3: 0.522 usec per loop 
 
 
# For large bytearray reallocation is much faster 
 
$ python -m timeit -s "s=bytearray('Hello World'*10000)" "s.translate('\0'*256)" 
1000 loops, best of 3: 225 usec per loop 
$ python -m timeit -s "s=bytearray('Hello World'*10000)" "lens=len(s);del s;s=bytearray(lens)" 
10000 loops, best of 3: 18.5 usec per loop 

有一种更好的方法可以让 s 保持相同的引用。您只需在实例上调用 __init__ 方法。

>>> s=bytearray(b"hello world") 
>>> id(s) 
3074325152L 
>>> s.__init__(len(s)) 
>>> s 
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 
>>> id(s) 
3074325152L 

测试时间

$ python -m timeit -s "s=bytearray('Hello World'*10000)" "s.__init__(len(s))" 
100000 loops, best of 3: 18.7 usec per loop 

我在另一台具有更多 RAM 的计算机上运行了这些 GB 测试

$ python -m timeit -s "s=bytearray('HelloWorld'*100000000)" "s.__init__(len(s))" 
10 loops, best of 3: 454 msec per loop 
$ python -m timeit -s "s=bytearray('HelloWorld'*100000000)" "s.translate('\0'*256)" 
10 loops, best of 3: 1.43 sec per loop