问题:Python列表与数组-何时使用?
如果要创建一维数组,则可以将其实现为列表,也可以使用标准库中的“数组”模块。我一直将列表用于一维数组。
我想改用数组模块的原因或情况是什么?
是为了性能和内存优化,还是我缺少明显的东西?
回答 0
基本上,Python列表非常灵活,可以保存完全不同的任意数据,并且可以在摊销后的固定时间内非常高效地附加到它们。如果您需要高效而又省时地缩小和扩展列表,则可以采用这些方法。但是它们比C数组占用更多的空间。
的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数据数组时,此选项很有用。
回答 1
在几乎所有情况下,正常列表都是正确的选择。数组模块更像是C数组的一个薄包装器,它为您提供了一种强类型的容器(请参阅docs),可以访问更多类似C的类型,例如有符号/无符号short或double,这不是构建的一部分-in类型。我说只有在确实需要时才使用arrays模块,在所有其他情况下,都坚持使用列表。
回答 2
如果您不知道为什么要使用它,那么数组模块就是其中一种您可能不需要的东西(请注意,我并不是要以居高临下的方式来说明这一点!) 。大多数时候,数组模块用于与C代码进行接口。为您提供有关性能问题的更直接答案:
对于某些用途,数组比列表更有效。如果需要分配一个您不会更改的数组,那么数组可以更快并且使用更少的内存。GvR有一个优化轶事,其中阵列模块是赢家(长期阅读,但值得)。
另一方面,列表消耗的内存比数组多的部分原因是因为当所有分配的元素都被使用时,python将分配一些额外的元素。这意味着将项目追加到列表的速度更快。因此,如果您计划添加项目,则要使用列表。
TL; DR如果您有特殊的优化需求或需要与C代码进行接口(并且不能使用pyrex),则仅使用数组。
回答 3
这是一个权衡!
每个人的优点:
清单
- 灵活
- 可以是异构的
数组(例如:numpy数组)
- 统一值数组
- 同质
- 紧凑(尺寸)
- 高效(功能和速度)
- 方便
回答 4
我的理解是,数组的存储效率更高(例如,内存的连续块与指向Python对象的指针),但是我不知道任何性能上的好处。另外,对于数组,您必须存储相同类型的原语,而列表可以存储任何内容。
回答 5
标准库数组对于二进制I / O很有用,例如将整数列表转换为要写入例如wave文件的字符串。也就是说,正如许多人已经指出的那样,如果您要进行任何实际工作,则应考虑使用NumPy。
回答 6
如果要使用数组,请考虑使用numpy或scipy包,它们为数组提供了更大的灵活性。
回答 7
数组只能用于特定类型,而列表可以用于任何对象。
数组也只能是一种类型的数据,而列表可以具有各种对象类型的条目。
数组对于某些数值计算也更加有效。
回答 8
numpy数组和list之间的重要区别是,数组切片是原始数组上的视图。这意味着不会复制数据,并且对视图的任何修改将反映在源数组中。
回答 9
这个答案将总结几乎所有有关何时使用List和Array的查询:
这两种数据类型之间的主要区别是可以对它们执行的操作。例如,您可以将数组除以3,然后将数组的每个元素除以3。使用列表无法完成相同的操作。
该列表是python语法的一部分,因此不需要声明它,而您必须在使用它之前声明该数组。
您可以将不同数据类型的值存储在列表中(异构),而在Array中,您只能存储相同数据类型的值(异构)。
数组具有丰富的功能和快速的功能,与列表相比,它广泛用于算术运算和存储大量数据。
与列表相比,数组占用的内存更少。