关于Python List vs. Array:Python List vs. Array – 何时使用?

Python List vs. Array - when to use?

如果要创建一维数组,可以将其作为列表实现,或者使用标准库中的"array"模块。我总是使用一维数组的列表。

我想使用阵列模块的原因或情况是什么?

是为了优化性能和内存,还是我遗漏了一些明显的东西?


基本上,python列表非常灵活,可以容纳完全异构的任意数据,并且可以非常有效地在摊余的固定时间内附加到这些数据中。如果你需要有效地缩短和增加你的列表时间,而不需要麻烦,那么它们就是你要做的事情。但是它们比C数组使用更多的空间。

另一方面,array.array类型只是C数组上的一个薄包装器。它只能保存相同类型的同构数据,因此只使用sizeof(one object) * length字节的内存。通常,当需要向扩展或系统调用(例如,ioctlfctnl公开C数组时,应该使用它。

array.array也是在python 2.x(array('B', bytes)中表示可变字符串的合理方法。然而,python 2.6+和3.x提供了一个可变的字节字符串作为bytearray

但是,如果你想对一个均匀的数值数据数组进行数学运算,那么你最好使用numpy,它可以自动向量化复杂的多维数组上的操作。

长话短说:当您出于数学以外的原因需要一个同构的C数组数据时,array.array非常有用。


对于几乎所有情况,正常列表都是正确的选择。arrays模块更像是C数组上的一个薄包装器,它为您提供了一种强类型容器(参见文档),可以访问更多的C类类型,如signed/unsigned short或double,这些类型不是内置类型的一部分。我想说,只有在您真正需要的时候才使用数组模块,在所有其他情况下都要使用列表。


如果你不知道为什么要使用数组模块(请注意,我并不是以一种屈尊的方式来这么说),那么数组模块就是其中一种你可能不需要的东西。.大多数情况下,数组模块用于与C代码接口。要更直接地回答您关于绩效的问题:

对于某些用途,数组比列表更有效。如果您需要分配一个您知道不会改变的数组,那么数组可以更快并且使用更少的内存。gvr有一个优化的轶事,其中数组模块是赢家(读得很长,但值得一读)。

另一方面,列表比数组占用更多内存的部分原因是,当所有分配的元素都被使用时,Python将分配一些额外的元素。这意味着将项目附加到列表的速度更快。因此,如果您计划添加项目,那么列表就是一种方法。

tl;dr只有当您有特殊的优化需求或者需要与C代码接口(并且不能使用Pyrex)时,我才会使用数组。


It's a trade off !

各自的优点:

列表

  • 灵活的
  • 可以是异构的

数组(例如:numpy数组)

  • 统一值数组
  • 同种类的
  • 紧凑型(尺寸)
  • 高效(功能和速度)
  • 方便的

我的理解是,数组的存储效率更高(即,作为连续的内存块与指向Python对象的指针),但我不知道任何性能优势。此外,对于数组,必须存储相同类型的基元,而列表可以存储任何内容。


标准库数组对于二进制I/O很有用,例如将一组整数转换为一个字符串,以写入一个波形文件。也就是说,正如许多人已经注意到的,如果你要做任何真正的工作,那么你应该考虑使用numpy。


如果您要使用数组,可以考虑使用numpy或scipy包,这样可以使数组具有更大的灵活性。


数组只能用于特定类型,而列表可以用于任何对象。

数组也只能有一种类型的数据,而列表可以有各种对象类型的条目。

阵列对于某些数值计算也更有效。


numpy数组和list之间的一个重要区别是数组切片是原始数组上的视图。这意味着数据不会被复制,对视图的任何修改都将反映在源数组中。