首页 文章

Python List vs. Array - 何时使用?

提问于
浏览
306

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

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

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

9 回答

  • 58

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

  • 5

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

  • 43

    如果您不知道为什么要使用它,那么阵列模块就是您可能不需要的那种东西之一(请注意我并不是想以一种居高临下的方式说出来!) . 大多数情况下,阵列模块用于与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) .

  • 5

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

  • 7

    基本上,Python列表非常灵活,可以保存完全异构的任意数据,并且可以非常高效地附加到amortized constant time中 . 如果您需要及时有效地缩小和增加阵列,而且没有麻烦,那么它们就是您的选择 . 但他们使用 a lot more space than C arrays .

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

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

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

    To make a long story shortarray.array 在您需要数据的同类C数组时非常有用,其原因不是数学 .

  • 363

    这是一个折衷!

    每个人的优点:

    列表

    • 灵活

    • 可以是异构的

    数组(例如:numpy数组)

    • 统一值数组

    • 同质

    • compact(大小)

    • 高效(功能和速度)

    • 方便

  • 0

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

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

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

  • 12

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

  • 12

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

相关问题