当创建一个 Python 字节数组(传递给它一个整数)时,它会创建一个包含那么多字节的字节数组,并将它们全部设置为零。
我想清除 bytearray,它可能非常大,迭代它并将内容设置为零的方式非常糟糕。
有没有更好的方法?
(memoryviews 和 bytearrays 在 IMO 中的记录很差)
迄今为止最好的资源(但没有一个能回答我的问题)
http://docs.python.org/dev/library/stdtypes.html#bytes-methods
请您参考如下方法:
为什么你认为重新分配字节数组这么慢?它比使用 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
