如果您正在创建一维数组,您可以将它作为列表,实现,否则使用标准库中的数组模块。我总是使用一维数组的列表。

是什么原因或情况下我想要改为使用阵列模块?

对于性能和内存优化,就是这样,或者我缺少明显的特征?

2008-10-06 20:17:43
问题评论:

回答:

基本上,Python 列表是非常灵活,可以容纳完全异构的、 任意的数据,并且他们可以追加到非常高效地分期常量时间。如果您需要缩小和扩大您的阵列时有效并且不麻烦,它们是路要走。但它们使用更多的空间比 C 数组.

array.array类型,另一方面,只是精简包装 C 阵列上。只同类数据,所有相同的类型,因此它可以保存,因此它只使用的sizeof(one object) * length字节的内存。大多数情况下,应使用它时您需要公开为延拓或系统调用 (例如, ioctlfctnl) 的 C 数组。它也是一个好的方法来表示可变字符串 (array('B', bytes)) 直到实际就会出现在 Python 3.0。

但是,如果您想要做数学同类数字数据的阵列上,然后就关闭使用 NumPy,可以自动 vectorize 复杂多维数组上的操作的好得多。

若要使长话短说array.array非常有用,当您需要数据的同构 C 数组的原因而不做数学.

Numpy.ndarray 是否有相同的内存占用量为 array.array?

@Gordon,它应该在一个大型的、 连续的数组的情况下非常相似︰ 它们都将需要sizeof(element)× (元素数目) 字节,再加上一个小固定开销的头。但是,ndarray 具有不连续和稀疏数组,处理一些高级的选项,我认为一些可插拔策略...为大型数组分配内存这些高级功能的部分后,可使用户内存更少,而其他人将通过使用更多内存来提高性能。

几乎所有情况下的正常列表是正确的选择。阵列模块是更多的类似的瘦包装通过 C 数组,这些数组提供类型的强类型的容器 (请参阅文档),以访问更多的类似于 C 的类型,如有符号/无符号短或双,它们不是内置类型的一部分。我要说的才是真正需要它,在所有其他情况下杆与列表中使用阵列模块。

应该会更快。

可能的从未使用过它真的不幸,但会有些微基准测试运行非常有趣。

实际上,我做了一个快速测试-我计时合计 100 米条目和相应的阵列中,相同的测试的列表,列表实际上大约快 10%。

因为数组"原始"数据上的操作需要不断创建和销毁 python 对象读取或写入数组时,列表是速度更快。

@Moe,正如我在我上面的答案指出,Python 的内置array不是做数学如果您尝试为合计 10 多种 NumPy 的ndarray ^8 个数字,它将会完全失败list消失。@tzot 具有正确了解为什么内置array是慢速的数学。

阵列模块是种类之一的这些事情,您可能不需要如果不知道您为什么使用它 (并且请注意,我不想说的是,condescending 的方式 !)。大多数情况下,使用阵列模块使用 C 代码的接口。为您提供有关性能问题更直接的答案︰

数组是某些用途的列表比效率更高。如果您需要分配一个数组,您知道不会改变,数组可以更快并使用较少的内存。GvR 具有优化的轶事的阵列模块说出到胜者 (多长时间,但值得这样做)。

另一方面,部分的向上比数组更多内存是因为 python 会分配一些额外的元素的所有分配元素时习惯吃列表的原因的描述。这意味着将项目附加到列表速度更快。因此,如果您计划添加项,列表是路要走。

TL; 我必须的使用数组,如果有异常的优化需要或您需要使用 C 代码接口 (和不能使用pyrex 生产的灾难恢复).

对于具体的示例和提速度优势 + 1。顶部的答案让我惊奇,"有时间内存折?"和"有对此不是非常复杂的内存过低的情况下,任何使用吗?"

我的理解是,更有效地存储阵列 (即连续块的形式与 Python 对象指针的内存),但我并不知道的任何性能优势。另外,与阵列必须存储基元类型相同,而列表可以存储任何内容。

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

数组可以还唯一数据的一种类型,而列表可以有各种对象类型的项。

数组也是一些数字的计算效率更高。

内建 python 数组不是性能高效,仅 memory-wise。

有更有效的处理数组的情况。请参阅下面我开机自检︰ stackoverflow.com/questions/176011/...

内容来源于Stack Overflow Python List vs. Array - when to use?
请输入您的翻译

Python List vs. Array - when to use?

确认取消