如果要创建一维数组,则可以将其实现为列表,或者使用标准库中的“数组”模块。我一直将列表用于一维数组。
我想改用数组模块的原因或情况是什么?
是为了性能和内存优化,还是我遗漏了一些明显的东西?
原文由 Corey Goldberg 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果要创建一维数组,则可以将其实现为列表,或者使用标准库中的“数组”模块。我一直将列表用于一维数组。
我想改用数组模块的原因或情况是什么?
是为了性能和内存优化,还是我遗漏了一些明显的东西?
原文由 Corey Goldberg 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
基本上,Python 列表非常灵活,可以保存完全异构的任意数据,并且可以在 摊销的常数时间内 非常有效地附加它们。如果您需要高效且轻松地缩小和增加列表,那么它们就是您的最佳选择。但它们使用 的空间比 C 数组多得多,部分原因是列表中的每个项目都需要构造一个单独的 Python 对象,即使对于可以用简单 C 类型表示的数据(例如
float
或uint64_t
)。另一方面,
array.array
类型只是 C 数组的一个薄包装器。它只能保存同质数据(即所有相同类型的数据),因此它仅使用sizeof(one object) * length
字节的内存。大多数情况下,您应该在需要将 C 数组公开给扩展或系统调用时使用它(例如,ioctl
或fctnl
)。array.array
也是在 Python 2.x (array('B', bytes)
) 中表示 可变 字符串的合理方式。但是,Python 2.6+ 和 3.x 提供了一个可变 字节 字符串bytearray
。但是,如果您想对同质的数值数据数组进行 数学运算,那么最好使用 NumPy,它可以自动对复杂的多维数组进行矢量化操作。
长话短说:
array.array
当您出于 数学以外 的原因需要同构 C 数据数组时很有用。