Python列表与数组 – 何时使用?
如果你正在创build一个1d数组,你可以将它实现为一个List,否则使用标准库中的'array'模块。 我一直使用1d数组的列表。
什么是我想要使用数组模块,而不是原因或情况?
这是为了性能和内存优化,还是我错过了一些明显的东西?
基本上,Python列表是非常灵活的,可以保存完全异构的,任意的数据,并且它们可以被非常有效地追加到分期固定的时间 。 如果您需要缩短和增加您的arrays时间,而且没有麻烦,他们是要走的路。 但是他们比C数组使用了更多的空间 。
另一方面, array.array
types只是C数组的一个薄包装。 它只能保存同类数据,全部是相同的types,所以它只使用sizeof(one object) * length
字节的内存。 大多数情况下,当您需要将C数组公开到系统调用(例如, ioctl
或fctnl
)时,您应该使用它。 这也是一个很好的方式来表示一个可变的string( array('B', bytes)
),直到在Python 3.0中真正变得可用。
然而,如果你想在同类的数值数据上进行math计算,那么使用NumPy会更好,它可以自动地向复杂的multidimensional array上进行操作。
长话短说 : array.array
是非常有用的,当你需要一个同质的C数据数据的原因, 而不是math 。
几乎所有的情况下,正常的名单是正确的select。 数组模块更像是一个C数组的薄包装,它给你一种强types的容器(参见文档 ),可以访问更多的类Ctypes,如signed / unsigned short或double,这些不是构build的一部分types。 我只能说,如果你真的需要使用数组模块,在所有其他情况下坚持使用列表。
如果你不知道为什么要使用它,那么数组模块就是你可能不需要的东西之一(注意,我不是以一种居高临下的方式来说的)。 。 大部分时间,数组模块用于与C代码进行交互。 为了更直接地回答你关于performance的问题:
数组比一些用途的列表更有效率。 如果你需要分配一个你知道不会改变的数组,那么数组可以更快,使用更less的内存。 GvR有一个优化轶事 ,其中arrays模块出来是胜利者(长期阅读,但值得)。
另一方面,list比数组占用更多内存的部分原因是因为当所有分配的元素被使用时,python会分配一些额外的元素。 这意味着将项目附加到列表更快。 所以如果你打算增加项目,一个清单是要走的路。
TL; DR我只会使用一个数组,如果你有一个特殊的优化需求,或者你需要与C代码接口(并且不能使用pyrex )。
我的理解是,数组的存储效率更高(即连续的内存块与指向Python对象的指针),但我不知道任何性能的好处。 此外,对于数组,您必须存储相同types的基元,而列表可以存储任何内容。
标准的库数组对于二进制I / O非常有用,比如将一个int列表转换成一个string,例如一个wave文件。 也就是说,正如很多人已经指出的那样,如果你打算做任何真正的工作,那么你应该考虑使用NumPy。
数组只能用于特定的types,而列表可以用于任何对象。
数组也可以只有一种types的数据,而列表可以有各种对象types的条目。
数组计算也更有效率。
如果要使用数组,请考虑numpy或scipy软件包,这为您提供了更大的灵活性。
这是一个折衷!
每个人的利弊:
名单
- 灵活
- 可以是异构的
数组(例如:numpy数组)
- 统一值的数组
- 同质
- 紧凑(大小)
- 高效(function和速度)
- 方便