【问题标题】:What is the fastest way to access elements in a nested list?访问嵌套列表中元素的最快方法是什么?
【发布时间】:2016-12-17 01:08:39
【问题描述】:

我有一个由三层组成的列表,出于说明目的看起来像这样:

a = [[['1'],['2'],['3'],['']],[['5'],['21','33']]]

因此,我有一个顶部列表,其中包含其他几个列表,每个列表又包含列表。

第一层将包含数十个列表。下一层可能包含数百万个列表,而底层将包含空字符串、单个字符串或少数值(每个值都是字符串)。

我现在需要访问最底层的值并将它们以特定顺序存储在一个新列表中,该顺序在循环内完成。访问这些值的最快方法是什么?使用的内存量不是我最关心的(尽管我显然也不想浪费它)。

我可以想到两种方法:

  1. 我直接访问列表a 以检索所需的值,例如a[1][1][0] 将返回 '21'
  2. 我创建了a 元素的副本,然后访问这些元素以使列表更加扁平化。因此,在这种情况下,例如:b=a[0]c=a[1] 因此,我现在将访问 b[1][0] 以检索 '21',而不是访问 a[1][1][0]

访问嵌套列表是否存在性能损失?因此,将列表 a 拆分为单独的列表是否有任何好处,还是我这样做只会招致 RAM 损失?

【问题讨论】:

    标签: python list python-2.7 nested-lists


    【解决方案1】:

    通过索引访问元素(即:a[1][1][0])是一个 O(1) 操作:source。你不会比这更快。

    现在,赋值也是一个 O(1) 操作,因此就速度而言,您描述的两种方法之间没有区别。第二个实际上不会引起任何内存问题,因为对列表的分配是通过引用而不是通过复制(除非您明确告诉它以其他方式执行)。

    【讨论】:

      【解决方案2】:

      鉴于b=a[0] 仅将另一个名称绑定到该索引处的列表,这两种方法或多或少是相同的。它不会复制列表。也就是说,唯一的区别是,在您的第二种方法中,唯一的区别是,除了访问嵌套列表之外,您最终还会抛出引用。所以,理论上,它会慢一点。

      正如@joaquinlpereyra 所指出的,Python Wiki 列出了此类操作的复杂性:https://wiki.python.org/moin/TimeComplexity

      所以,长答案缩短:仅访问列表项更快。

      【讨论】:

      • 理论上更快,但赋值只是另一个 O(1) 操作,所以在实践中它不会真正改变任何事情。
      • @joaquinlpereyra 不是访问元素的 O(1) 和分配的 O(1) 吗?
      • 是的。这仍然是 O(1)。复杂性被定义为(数学)极限。这很有趣:en.wikipedia.org/wiki/Big_O_notation。基本上。你可以有 N (n 一个常数) O(1) 操作,算法仍然是 O(1)。
      • 我知道。但这不是两个独立的操作吗?
      • 他们是。 O(1) + O(1) = O(1)。 O(n) (n 常数) = O(1)。如果 n 随着列表中元素数量的增加而线性增加,则算法为 O(n)。访问元素是 O(1)。所以它只是几个 O(1) 操作。访问 所有 个列表的元素是 O(n)。
      猜你喜欢
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多