Python List vs. Array - when to use?
如果要创建一维数组,可以将其作为列表实现,或者使用标准库中的"array"模块。我总是使用一维数组的列表。
我想使用阵列模块的原因或情况是什么?
是为了优化性能和内存,还是我遗漏了一些明显的东西?
基本上,python列表非常灵活,可以容纳完全异构的任意数据,并且可以非常有效地在摊余的固定时间内附加到这些数据中。如果你需要有效地缩短和增加你的列表时间,而不需要麻烦,那么它们就是你要做的事情。但是它们比C数组使用更多的空间。
另一方面,
但是,如果你想对一个均匀的数值数据数组进行数学运算,那么你最好使用numpy,它可以自动向量化复杂的多维数组上的操作。
长话短说:当您出于数学以外的原因需要一个同构的C数组数据时,
对于几乎所有情况,正常列表都是正确的选择。arrays模块更像是C数组上的一个薄包装器,它为您提供了一种强类型容器(参见文档),可以访问更多的C类类型,如signed/unsigned short或double,这些类型不是内置类型的一部分。我想说,只有在您真正需要的时候才使用数组模块,在所有其他情况下都要使用列表。
如果你不知道为什么要使用数组模块(请注意,我并不是以一种屈尊的方式来这么说),那么数组模块就是其中一种你可能不需要的东西。.大多数情况下,数组模块用于与C代码接口。要更直接地回答您关于绩效的问题:
对于某些用途,数组比列表更有效。如果您需要分配一个您知道不会改变的数组,那么数组可以更快并且使用更少的内存。gvr有一个优化的轶事,其中数组模块是赢家(读得很长,但值得一读)。
另一方面,列表比数组占用更多内存的部分原因是,当所有分配的元素都被使用时,Python将分配一些额外的元素。这意味着将项目附加到列表的速度更快。因此,如果您计划添加项目,那么列表就是一种方法。
tl;dr只有当您有特殊的优化需求或者需要与C代码接口(并且不能使用Pyrex)时,我才会使用数组。
It's a trade off !
号
各自的优点:
列表- 灵活的
- 可以是异构的
数组(例如:numpy数组)
- 统一值数组
- 同种类的
- 紧凑型(尺寸)
- 高效(功能和速度)
- 方便的
我的理解是,数组的存储效率更高(即,作为连续的内存块与指向Python对象的指针),但我不知道任何性能优势。此外,对于数组,必须存储相同类型的基元,而列表可以存储任何内容。
标准库数组对于二进制I/O很有用,例如将一组整数转换为一个字符串,以写入一个波形文件。也就是说,正如许多人已经注意到的,如果你要做任何真正的工作,那么你应该考虑使用numpy。
如果您要使用数组,可以考虑使用numpy或scipy包,这样可以使数组具有更大的灵活性。
数组只能用于特定类型,而列表可以用于任何对象。
数组也只能有一种类型的数据,而列表可以有各种对象类型的条目。
阵列对于某些数值计算也更有效。
numpy数组和list之间的一个重要区别是数组切片是原始数组上的视图。这意味着数据不会被复制,对视图的任何修改都将反映在源数组中。