Python 列表与数组——何时使用?

2025-01-03 08:40:00
admin
原创
117
摘要:问题描述:如果您要创建一维数组,则可以将其实现为列表,或者使用标准库中的“array”模块。我一直将列表用于一维数组。我在什么情况下会想要使用数组模块?这是为了性能和内存优化,还是我忽略了一些明显的东西?解决方案 1:基本上,Python 列表非常灵活,可以容纳完全异构的任意数据,并且可以在摊销常数时间内非常...

问题描述:

如果您要创建一维数组,则可以将其实现为列表,或者使用标准库中的“array”模块。我一直将列表用于一维数组。

我在什么情况下会想要使用数组模块?

这是为了性能和内存优化,还是我忽略了一些明显的东西?


解决方案 1:

基本上,Python 列表非常灵活,可以容纳完全异构的任意数据,并且可以在摊销常数时间内非常高效地添加数据。如果您需要高效地缩小和扩大列表,那么它们是您的最佳选择。但它们比 C 数组占用的空间要大得多float,部分原因是列表中的每个项目都需要构建一个单独的 Python 对象,即使对于可以用简单 C 类型(例如或)表示的数据也是如此uint64_t

array.array另一方面,该类型只是 C 数组的一个薄包装器。它只能保存同类数据(即所有数据均为同一类型),因此它仅占用内存字节。大多数情况下,当您需要将 C 数组公开给扩展或系统调用(例如或)sizeof(one object) * length时,您应该使用它。ioctl`fctnl`

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

但是,如果您想对同类数值数据数组进行数学运算,那么最好使用 NumPy,它可以自动对复杂多维数组上的操作进行矢量化。

长话短说:当你出于除数学之外的其他array.array原因而需要一个同类的 C 数据数组时很有用。

解决方案 2:

对于几乎所有情况,普通列表都是正确的选择。数组模块更像是 C 数组的薄包装器,它为您提供了一种强类型容器(请参阅文档),可以访问更多类似 C 的类型,例如有符号/无符号短整型或双精度型,这些类型不属于内置类型。我认为只有在真正需要时才使用数组模块,在所有其他情况下都坚持使用列表。

解决方案 3:

如果您不知道为什么要使用数组模块,那么您可能不需要它(请注意,我并不是想以一种居高临下的姿态说这句话!)。大多数情况下,数组模块用于与 C 代码交互。为了更直接地回答您关于性能的问题,请执行以下操作:

对于某些用途,数组比列表更有效。如果您需要分配一个您知道不会改变的数组,那么数组可以更快并且占用更少的内存。GvR 有一个优化轶事,其中数组模块是赢家(很长,但值得一读)。

另一方面,列表比数组占用更多内存的原因之一是,当所有分配的元素都被使用时,python 会分配一些额外的元素。这意味着将项目附加到列表中会更快。因此,如果您计划添加项目,列表是最佳选择。

TL;DR 如果您有特殊的优化需求或者需要与 C 代码交互(并且不能使用pyrex),我才会使用数组。

解决方案 4:

这是一种权衡!

每种方法的优点:

列表

  • 灵活的

  • 可以是异构的

数组(例如:numpy 数组)

  • 统一值数组

  • 均质的

  • 紧凑(尺寸)

  • 高效(功能和速度)

  • 方便的

解决方案 5:

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

解决方案 6:

这个答案将总结关于何时使用 List 和 Array 的几乎所有疑问:

  1. 这两种数据类型之间的主要区别在于您可以对它们执行的操作。例如,您可以将数组除以 3,它会将数组的每个元素除以 3。列表则不能这样做。

  2. 列表是 Python 语法的一部分,因此不需要声明,而数组在使用之前必须声明。

  3. 您可以在列表中存储不同数据类型的值(异构),而在数组中只能存储相同数据类型的值(同质)。

  4. 与列表相比,数组功能丰富且速度快,广泛用于算术运算和存储大量数据。

  5. 与列表相比,数组占用的内存更少。

解决方案 7:

标准库数组对于二进制 I/O 很有用,例如将整数列表转换为字符串以写入 wave 文件。话虽如此,正如许多人已经指出的那样,如果您要进行任何实际工作,那么您应该考虑使用 NumPy。

解决方案 8:

关于性能,以下是一些比较 Python 列表、数组和 Numpy 数组的数据(均使用 2017 年 Macbook Pro 上的 Python 3.7)。最终结果是 Python 列表在这些操作中速度最快。

# Python list with append()
np.mean(timeit.repeat(setup="a = []", stmt="a.append(1.0)", number=1000, repeat=5000)) * 1000
# 0.054 +/- 0.025 msec

# Python array with append()
np.mean(timeit.repeat(setup="import array; a = array.array('f')", stmt="a.append(1.0)", number=1000, repeat=5000)) * 1000
# 0.104 +/- 0.025 msec

# Numpy array with append()
np.mean(timeit.repeat(setup="import numpy as np; a = np.array([])", stmt="np.append(a, [1.0])", number=1000, repeat=5000)) * 1000
# 5.183 +/- 0.950 msec

# Python list using +=
np.mean(timeit.repeat(setup="a = []", stmt="a += [1.0]", number=1000, repeat=5000)) * 1000
# 0.062 +/- 0.021 msec

# Python array using += 
np.mean(timeit.repeat(setup="import array; a = array.array('f')", stmt="a += array.array('f', [1.0]) ", number=1000, repeat=5000)) * 1000
# 0.289 +/- 0.043 msec

# Python list using extend()
np.mean(timeit.repeat(setup="a = []", stmt="a.extend([1.0])", number=1000, repeat=5000)) * 1000
# 0.083 +/- 0.020 msec

# Python array using extend()
np.mean(timeit.repeat(setup="import array; a = array.array('f')", stmt="a.extend([1.0]) ", number=1000, repeat=5000)) * 1000
# 0.169 +/- 0.034

解决方案 9:

如果您要使用数组,请考虑使用 numpy 或 scipy 包,它们可以为您的数组提供更大的灵活性。

解决方案 10:

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

数组也只能包含一种类型的数据,而列表可以包含各种对象类型的条目。

对于某些数值计算来说,数组也更有效率。

解决方案 11:

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用