如果要创建一维数组,则可以将其实现为列表,也可以使用标准库中的“数组”模块。我一直将列表用于一维数组。
我想改用数组模块的原因或情况是什么?
是为了性能和内存优化,还是我缺少明显的东西?
基本上,Python列表非常灵活,可以保存完全异构的任意数据,并且可以在摊销后的固定时间内非常高效地附加到它们。如果您需要高效而又省时地缩小和增加列表,则可以采用这些方法。但是它们 比C数组占用更多的空间 ,部分原因是列表中的每个项目都需要构造一个单独的Python对象,即使对于可以用简单C类型(例如float或uint64_t)表示的数据也是如此。
float
uint64_t
的array.array类型,在另一方面,是只在C数组的薄包装。它只能保存同构数据(即所有相同类型的数据),因此仅使用sizeof(one object) * length内存字节。通常,在需要将C数组公开给扩展名或系统调用(例如ioctl或fctnl)时,应使用它。
array.array
sizeof(one object) * length
ioctl
fctnl
array.array也是在Python 2.x()中表示 可变 字符串的一种合理方法array('B', bytes)。但是,Python 2.6+和3.x提供了一个可变 字节 字符串bytearray。
array('B', bytes)
bytearray
但是,如果要对数字数据的均质数组进行 数学运算 ,则最好使用NumPy,它可以自动对复杂的多维数组进行矢量化操作。
简而言之 :array.array当您需要 除数学之外的其他 原因而需要同构C数据数组时,此选项很有用。