Python 列表与数组 – 何时使用?
如果你要创建一个一维数组,可以用列表来实现,或者使用标准库里的'array'模块。我一直都是用列表来做一维数组。
那我在什么情况下会想要使用'array'模块呢?
是为了提高性能和节省内存,还是我漏掉了什么明显的东西呢?
11 个回答
数组模块其实是一个你可能不会用到的东西,除非你知道为什么要用它(我不是想以居高临下的态度说这句话!)。大多数情况下,数组模块是用来和C语言代码打交道的。为了直接回答你关于性能的问题:
在某些情况下,数组比列表更高效。如果你需要分配一个你知道不会改变的数组,那么数组可能会更快,且占用更少的内存。GvR有一个优化的故事,在这个故事中,数组模块表现得更好(虽然读起来比较长,但值得一看)。
另一方面,列表占用更多内存的部分原因是,Python在所有分配的元素都被使用时,会额外分配一些元素。这意味着向列表中添加项目会更快。所以如果你打算添加项目,使用列表更合适。
总之,只有在你有特别的优化需求或者需要和C代码接口(而且不能使用pyrex)的时候,我才会建议使用数组。
在几乎所有情况下,普通的列表都是最合适的选择。数组模块更像是对C语言数组的一个简单封装,它提供了一种强类型的容器(可以查看文档),可以使用一些更像C语言的类型,比如有符号/无符号短整型或双精度浮点型,这些类型并不是Python内置的。我建议只有在你真的需要的时候才使用数组模块,其他情况下还是用列表比较好。
简单来说,Python 的列表非常灵活,可以存放各种不同类型的数据,而且添加新数据的速度很快,几乎是恒定的时间。如果你需要一个可以随时增减大小的列表,而且希望操作起来简单方便,那就用 Python 列表吧。不过,它们占用的内存比 C 语言的数组要多得多,因为列表中的每个元素都需要单独创建一个 Python 对象,即使这些数据可以用简单的 C 类型表示(比如 float
或 uint64_t
)。
而 array.array
类型则是 C 数组的一个简单封装。它只能存放同一种类型的数据,所以它的内存使用量是 sizeof(one object) * length
字节。通常情况下,当你需要将 C 数组传递给扩展或系统调用(比如 ioctl
或 fctnl
)时,使用它是比较合适的。
array.array
也是在 Python 2.x 中表示可变字符串的一种合理方式(比如 array('B', bytes)
)。不过,Python 2.6 及以上版本和 3.x 提供了一种可变的 字节 字符串,叫做 bytearray
。
但是,如果你想对一组同类型的数字数据进行 数学运算,那么使用 NumPy 会更好,它可以自动处理复杂的多维数组运算。
总之:array.array
在你需要一个同类型的 C 数组,但不是为了数学运算时非常有用。