Answers:
基本上,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数据数组时,此选项很有用。
sizeof(element)
×(元素数)个字节,再加上一个小的固定报头来管理开销。但是,ndarray有一些用于处理不连续和稀疏数组的高级选项,我认为一些为大型数组分配内存的可插拔策略...其中一些高级功能将使其占用更少的内存,而其他一些功能将通过使用更多功能来提高性能记忆。
在几乎所有情况下,正常列表都是正确的选择。数组模块更像是C数组的一个薄包装器,它为您提供了一种强类型的容器(请参阅docs),可以访问更多类似C的类型,例如有符号/无符号short或double,这不是构建的一部分-in类型。我说只有在确实需要时才使用arrays模块,在所有其他情况下,都坚持使用列表。
array
函数,而是用于数学运算。如果您尝试使用NumPy ndarray
求和一个10 ^ 8的数字数组,它将完全list
消失。@tzot对内置array
函数为何运算速度较慢有正确的想法。
如果您不知道为什么要使用它,那么数组模块就是其中一种您可能不需要的东西(请注意,我并不是要以居高临下的方式来说明这一点!) 。大多数时候,数组模块用于与C代码进行接口。为您提供有关性能问题的更直接答案:
对于某些用途,数组比列表更有效。如果需要分配一个您不会更改的数组,那么数组可以更快并且使用更少的内存。GvR有一个优化轶事,其中阵列模块是赢家(长期阅读,但值得)。
另一方面,列表消耗的内存比数组多的部分原因是因为当所有分配的元素都被使用时,python将分配一些额外的元素。这意味着将项目追加到列表的速度更快。因此,如果您计划添加项目,则要使用列表。
TL; DR如果您有特殊的优化需求或需要与C代码进行接口(并且不能使用pyrex),则仅使用数组。
这是一个权衡!
每个人的优点:
数组只能用于特定类型,而列表可以用于任何对象。
数组也只能是一种类型的数据,而列表可以具有各种对象类型的条目。
数组对于某些数值计算也更加有效。
这个答案将总结几乎所有有关何时使用List和Array的查询:
这两种数据类型之间的主要区别是可以对它们执行的操作。例如,您可以将数组除以3,然后将数组的每个元素除以3。使用列表无法完成相同的操作。
该列表是python语法的一部分,因此不需要声明它,而您必须在使用它之前声明该数组。
您可以将不同数据类型的值存储在列表中(异构),而在Array中,您只能存储相同数据类型的值(异构)。
数组具有丰富的功能和快速的功能,与列表相比,它广泛用于算术运算和存储大量数据。
与列表相比,数组占用的内存更少。