代码之家  ›  专栏  ›  技术社区  ›  Corey Goldberg

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

  •  315
  • Corey Goldberg  · 技术社区  · 17 年前

    我想改用阵列模块的原因或情况是什么?

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

    9 回复  |  直到 11 年前
        1
  •  471
  •   Dan Lenski    6 年前

    基本上,Python列表非常灵活,可以容纳完全异构的任意数据,并且可以非常高效地添加到 amortized constant time . 如果你需要在没有麻烦的情况下高效地缩减和增加你的列表时间,那么它们就是最好的选择。但是他们使用 比C数组大得多的空间 ,部分原因是列表中的每个项都需要构造一个单独的Python对象,即使对于可以用简单C类型表示的数据(例如。 float 或 uint64_t

    这个 array.array 另一方面,类型只是C数组上的一个薄包装器。它只能保存同质数据(也就是说,所有相同类型的数据),因此它只使用 sizeof(one object) * length ioctl 或 fctnl ).

    array.array 也是一种合理的方式来表示 易变的 array('B', bytes) )但是,Python2.6+和3.x提供了一个可变的 字节 bytearray .

    在数值数据的同质数组上,最好使用NumPy,它可以自动将复杂多维数组上的操作矢量化。

    长话短说 当您出于某些原因需要一个同质的C数据数组时,它非常有用 .

        2
  •  68
  •   Etaoin    13 年前

    docs ),可以访问更多类似C的类型,如有符号/无符号short或double,这些类型不是内置类型的一部分。我想说,只有在您真正需要的时候才使用arrays模块,在所有其他情况下,请坚持使用列表。

        3
  •  55
  •   Dennis van der Schagt Jason Baker    11 年前

    如果您不知道为什么要使用阵列模块,那么阵列模块可能是您不需要的东西之一(请注意,我并不是以一种居高临下的方式这么说!)。大多数情况下,数组模块用于与C代码接口。要更直接地回答有关性能的问题,请执行以下操作:

    对于某些用途,数组比列表更有效。如果您需要分配一个您知道不会更改的阵列,那么阵列可以更快并且使用更少的内存。GvR有一个 optimization anecdote

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

    TL;DR I只会在您有特殊优化需求或需要与C代码接口(并且不能使用 pyrex ).

        4
  •  21
  •   Mohammad Mahdi KouchakYazdi    9 年前

    每种方法的优点:

    列表

    数组(例如:numpy数组)

    • 统一值数组
    • 紧凑型(尺寸)
        5
  •  13
  •   Ben Hoffstein    17 年前

        6
  •  8
  •   giltay    17 年前

    标准库数组对于二进制I/O非常有用,例如将INT列表转换为字符串以写入(例如)wave文件。正如许多人已经注意到的那样,如果你要做任何真正的工作,那么你应该考虑使用NUMPY。

        7
  •  6
  •   Alex Coventry    17 年前

        8
  •  5
  •   Hortitude    17 年前

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

        9
  •  5
  •   Hephaestus    6 年前

    在性能方面,以下是一些比较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
    
        10
  •  4
  •   Dipen Gajjar    7 年前

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

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

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

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

        11
  •  0
  •   vivek    8 年前

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

    推荐文章