清空一个bytearray的正确Python方法

9

我想使用memset函数。我有一个类中的帧缓冲区,其中包含从其他操作中获取的数据,现在我想将该帧缓冲区中的所有内容清除为0x00或0xFF。我在文档中没有看到clear方法,但有一个可能有效的zfill方法。我考虑只是再次调用字节数组的init方法,但不确定是否会在以后导致内存问题。

我正在使用Python 2.7。

3个回答

6

Python不同于C语言,在这里你不需要过多地担心内存问题。你只需要简单地执行:

a = bytearray("abcd") # initialized it with real data

a = bytearray(5) # just a byte array of size 5 filled with zeros

1
这应该是正确的答案。为什么要选择高级语言(Python)来像低级语言(C)一样使用它? - Mr. E
1
这在某些情况下是可行的。但是有一些类似于字节数组的对象,比如mmap,你实际上有时候想要清空内容。 - Antti Haapala -- Слава Україні
@AnttiHaapala,bytearray-like 不等同于 bytearray,对吗? - ForceBru
1
基本上这几乎总是错误的答案。bytearray 很少被使用...只有在内存管理至关重要时才会使用它们。 - Erik Aronesty
高速解析二进制数据(例如来自串口的数据)可能需要在固定内存大小和位置的内部缓冲区中快速设置和清除数据(使用“高级”方法会导致RAM快速填满),一旦达到虚拟内存,性能就会大大降低。 - gorgoth

4
In [1]: ba = bytearray(range(100))

In [2]: ba
Out[2]: bytearray(b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abc')

In [3]: ba[:] = b'\x00' * len(ba)

In [4]: ba
Out[4]: bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

3
如果您想在帧缓冲区上进行高性能操作,请考虑使用NumPy。您可以将帧缓冲区表示为一个 uint8 数组的NumPy数组:
import numpy as np
fb = np.zeros((480, 640), dtype=np.uint8) # a 640x480 monochrome framebuffer

然后非常简单地清除帧缓冲区:

fb[:] = 0 # or fb[:] = 0xff

另一个重要的优势是,您可以获得快速的二维数组 - 您可以像这样执行操作:fb[80:120, 40:60],以便廉价地获取矩形区域,并且您可以使用非常少的代码实现绘图操作,例如blitting。此外,通过np.tobytes,您仍然可以获得字节表示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接