Python List vs. Array - 何时使用?

时间:2008-10-06 20:17:43

标签: python arrays list

如果要创建1d数组,可以将其实现为List,或者使用标准库中的“array”模块。我总是使用列表进行一维数组。

我想要使用阵列模块的原因是什么?

它是用于性能和内存优化,还是我错过了一些明显的东西?

11 个答案:

答案 0 :(得分:387)

基本上,Python列表非常灵活,可以保存完全异构的任意数据,并且可以在amortized constant time中非常有效地附加它们。如果你需要有效地缩短和增加你的列表并且没有麻烦,那么它们就是你要走的路。但他们使用比C数组更多的空间

另一方面,array.array类型只是C数组上的一个瘦包装器。它只能保存同类数据,所有类型都相同,因此它只使用sizeof(one object) * length个字节的内存。大多数情况下,当您需要将C数组公开给扩展或系统调用时(例如,ioctlfctnl),您应该使用它。

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

但是,如果你想在同类数组数据上做数学,那么你最好使用NumPy,它可以自动对复杂的多维数组上的操作进行矢量化。

简而言之array.array在您需要一个同类C数据数据时非常有用,原因不在于

答案 1 :(得分:60)

对于几乎所有情况,正常列表都是正确的选择。数组模块更像是C数组上的一个瘦包装器,它为您提供了一种强类型容器(请参阅docs),可以访问更多类似C的类型,例如signed / unsigned short或double,它们不是部分内置类型。我会说只有你真的需要它才能使用数组模块,在所有其他情况下都坚持使用列表。

答案 2 :(得分:48)

如果您不知道为什么要使用它,那么阵列模块就是您可能不需要的那种东西之一(请注意我并不是想以一种居高临下的方式说出来)方式!)。大多数情况下,阵列模块用于与C代码接口。为了更直接地回答有关绩效的问题:

对于某些用途,数组比列表更有效。如果你需要分配一个你知道不会改变的数组,那么数组可以更快并且使用更少的内存。 GvR有一个optimization anecdote,阵列模块在其中成为赢家(长读,但值得)。

另一方面,列表占用更多内存而不是数组的部分原因是因为python将在使用所有已分配元素时分配一些额外元素。这意味着将项目附加到列表更快。因此,如果您计划添加项目,则可以使用列表。

TL; DR如果您有特殊的优化需求,或者您需要与C代码接口(并且不能使用pyrex),我只会使用数组。

答案 3 :(得分:15)

  

这是一种权衡!

每个人的优点:

列表

  • 灵活
  • 可以是异构的

数组(例如:numpy数组)

  • 统一值数组
  • 同质
  • 紧凑(大小)
  • 高效(功能和速度)
  • 方便

答案 4 :(得分:13)

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

答案 5 :(得分:7)

标准库数组对二进制I / O非常有用,例如将int列表转换为要写入波形文件的字符串。也就是说,正如许多人已经指出的那样,如果你要做任何真正的工作,那么你应该考虑使用NumPy。

答案 6 :(得分:5)

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

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

对于某些数值计算,数组也更有效。

答案 7 :(得分:5)

如果您要使用数组,请考虑numpy或scipy包,它们为您提供更多灵活性的数组。

答案 8 :(得分:3)

关于性能,以下是一些比较python列表,数组和numpy数组的数字(全部与2017年Macbook Pro上的python 3.7进行比较)。 最终结果是这些操作最快的是python列表。

# Python list with append()
np.mean(timeit.repeat(setup="a = []", stmt="a.append(1.0)", number=1000, repeat=5000)) * 1000
# 0.054 +/- 0.025 msec

# Python array with append()
np.mean(timeit.repeat(setup="import array; a = array.array('f')", stmt="a.append(1.0)", number=1000, repeat=5000)) * 1000
# 0.104 +/- 0.025 msec

# Numpy array with append()
np.mean(timeit.repeat(setup="import numpy as np; a = np.array([])", stmt="np.append(a, [1.0])", number=1000, repeat=5000)) * 1000
# 5.183 +/- 0.950 msec

# Python list using +=
np.mean(timeit.repeat(setup="a = []", stmt="a += [1.0]", number=1000, repeat=5000)) * 1000
# 0.062 +/- 0.021 msec

# Python array using += 
np.mean(timeit.repeat(setup="import array; a = array.array('f')", stmt="a += array.array('f', [1.0]) ", number=1000, repeat=5000)) * 1000
# 0.289 +/- 0.043 msec

# Python list using extend()
np.mean(timeit.repeat(setup="a = []", stmt="a.extend([1.0])", number=1000, repeat=5000)) * 1000
# 0.083 +/- 0.020 msec

# Python array using extend()
np.mean(timeit.repeat(setup="import array; a = array.array('f')", stmt="a.extend([1.0]) ", number=1000, repeat=5000)) * 1000
# 0.169 +/- 0.034

答案 9 :(得分:0)

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

答案 10 :(得分:0)

此答案将总结几乎所有有关何时使用列表和数组的查询:

  1. 这两种数据类型之间的主要区别是可以对它们执行的操作。例如,您可以将数组除以3,然后将数组的每个元素除以3。使用列表无法完成相同的操作。

  2. 该列表是python语法的一部分,因此不需要声明它,而您必须在使用它之前声明该数组。

  3. 您可以将不同数据类型的值存储在列表中(异构),而在Array中,您只能存储相同数据类型(异构)的值。

  4. 数组具有丰富的功能和快速的功能,与列表相比,它广泛用于算术运算和存储大量数据。

  5. 与列表相比,数组占用的内存更少。