如果要创建1d数组,可以将其实现为List,或者使用标准库中的“array”模块 . 我一直使用列表的1d数组 .
我想要使用阵列模块的原因或环境是什么?
它是用于性能和内存优化,还是我错过了一些明显的东西?
如果您要使用数组,请考虑numpy或scipy包,它们为您提供了更多灵活性的数组 .
numpy数组和列表之间的一个重要区别是数组切片是原始数组上的视图 . 这意味着不会复制数据,对视图的任何修改都将反映在源数组中 .
如果您不知道为什么要使用它,那么阵列模块就是您可能不需要的那种东西之一(请注意我并不是想以一种居高临下的方式说出来!) . 大多数情况下,阵列模块用于与C代码接口 . 为了更直接地回答有关性能的问题:
对于某些用途,数组比列表更有效 . 如果你需要分配一个你知道不会改变的数组,那么数组可以更快并且使用更少的内存 . GvR有一个optimization anecdote,其中数组模块成为赢家(长读,但值得) .
另一方面,列表占用更多内存而不是数组的部分原因是因为python将在使用所有已分配元素时分配一些额外元素 . 这意味着将项目附加到列表更快 . 因此,如果您计划添加项目,则可以使用列表 .
TL; DR I 'd only use an array if you had an exceptional optimization need or you need to interface with C code (and can' t使用pyrex) .
对于几乎所有情况,正常列表是正确的选择 . 数组模块更像是C数组上的一个瘦包装器,它为您提供了一种强类型容器(请参阅docs),可以访问更多类似C的类型,例如signed / unsigned short或double,它们不是构建的一部分-in类型 . 我会说只有你真的需要它才能使用数组模块,在所有其他情况下都坚持使用列表 .
基本上,Python列表非常灵活,可以保存完全异构的任意数据,并且可以非常高效地附加到amortized constant time中 . 如果您需要及时有效地缩小和增加阵列,而且没有麻烦,那么它们就是您的选择 . 但他们使用 a lot more space than C arrays .
另一方面, array.array 类型只是C数组上的一个瘦包装器 . 它只能保存同类数据,所有类型都相同,因此它只使用 sizeof(one object) * length 字节的内存 . 大多数情况下,您需要在需要将C数组公开给扩展或系统调用时使用它(例如, ioctl 或 fctnl ) .
array.array
sizeof(one object) * length
ioctl
fctnl
array.array 也是在Python 2.x( array('B', bytes) )中表示 mutable 字符串的合理方法 . 但是,Python 2.6和3.x提供了一个可变字节字符串bytearray .
array('B', bytes)
但是,如果你想在同类数组数据上做 math ,那么你最好使用NumPy,它可以自动地对复杂的多维数组上的操作进行矢量化 .
To make a long story short : array.array 在您需要数据的同类C数组时非常有用,其原因不是数学 .
这是一个折衷!
每个人的优点:
灵活
可以是异构的
统一值数组
同质
compact(大小)
高效(功能和速度)
方便
数组只能用于特定类型,而列表可用于任何对象 .
数组也可以只有一种类型的数据,而列表可以有各种对象类型的条目 .
对于某些数值计算,数组也更有效 .
标准库数组对二进制I / O非常有用,例如将int列表转换为要写入波形文件的字符串 . 也就是说,正如许多人已经指出的那样,如果你要做任何真正的工作,那么你应该考虑使用NumPy .
我的理解是数组存储更有效(即作为连续的内存块与指向Python对象的指针),但我不知道任何性能优势 . 此外,对于数组,您必须存储相同类型的基元,而列表可以存储任何内容 .
9 回答
如果您要使用数组,请考虑numpy或scipy包,它们为您提供了更多灵活性的数组 .
numpy数组和列表之间的一个重要区别是数组切片是原始数组上的视图 . 这意味着不会复制数据,对视图的任何修改都将反映在源数组中 .
如果您不知道为什么要使用它,那么阵列模块就是您可能不需要的那种东西之一(请注意我并不是想以一种居高临下的方式说出来!) . 大多数情况下,阵列模块用于与C代码接口 . 为了更直接地回答有关性能的问题:
对于某些用途,数组比列表更有效 . 如果你需要分配一个你知道不会改变的数组,那么数组可以更快并且使用更少的内存 . GvR有一个optimization anecdote,其中数组模块成为赢家(长读,但值得) .
另一方面,列表占用更多内存而不是数组的部分原因是因为python将在使用所有已分配元素时分配一些额外元素 . 这意味着将项目附加到列表更快 . 因此,如果您计划添加项目,则可以使用列表 .
TL; DR I 'd only use an array if you had an exceptional optimization need or you need to interface with C code (and can' t使用pyrex) .
对于几乎所有情况,正常列表是正确的选择 . 数组模块更像是C数组上的一个瘦包装器,它为您提供了一种强类型容器(请参阅docs),可以访问更多类似C的类型,例如signed / unsigned short或double,它们不是构建的一部分-in类型 . 我会说只有你真的需要它才能使用数组模块,在所有其他情况下都坚持使用列表 .
基本上,Python列表非常灵活,可以保存完全异构的任意数据,并且可以非常高效地附加到amortized constant time中 . 如果您需要及时有效地缩小和增加阵列,而且没有麻烦,那么它们就是您的选择 . 但他们使用 a lot more space than C arrays .
另一方面,
array.array
类型只是C数组上的一个瘦包装器 . 它只能保存同类数据,所有类型都相同,因此它只使用sizeof(one object) * length
字节的内存 . 大多数情况下,您需要在需要将C数组公开给扩展或系统调用时使用它(例如,ioctl
或fctnl
) .array.array
也是在Python 2.x(array('B', bytes)
)中表示 mutable 字符串的合理方法 . 但是,Python 2.6和3.x提供了一个可变字节字符串bytearray .但是,如果你想在同类数组数据上做 math ,那么你最好使用NumPy,它可以自动地对复杂的多维数组上的操作进行矢量化 .
To make a long story short :
array.array
在您需要数据的同类C数组时非常有用,其原因不是数学 .每个人的优点:
列表
灵活
可以是异构的
数组(例如:numpy数组)
统一值数组
同质
compact(大小)
高效(功能和速度)
方便
数组只能用于特定类型,而列表可用于任何对象 .
数组也可以只有一种类型的数据,而列表可以有各种对象类型的条目 .
对于某些数值计算,数组也更有效 .
标准库数组对二进制I / O非常有用,例如将int列表转换为要写入波形文件的字符串 . 也就是说,正如许多人已经指出的那样,如果你要做任何真正的工作,那么你应该考虑使用NumPy .
我的理解是数组存储更有效(即作为连续的内存块与指向Python对象的指针),但我不知道任何性能优势 . 此外,对于数组,您必须存储相同类型的基元,而列表可以存储任何内容 .