访问嵌套列表中元素的最快方法是什么?

时间:2016-08-10 14:56:57

标签: python list python-2.7 nested-lists

我有一个由三个层组成的列表,看起来像是为了说明目的:

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

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

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

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

我可以想到两种方式:

  1. 我直接访问列表a以检索所需的值,例如a[1][1][0]将返回'21'
  2. 我创建了a元素的副本,然后访问这些元素以使列表更加扁平化。因此,在这种情况下,例如:b=a[0]c=a[1]所以我现在不会访问a[1][1][0]而是访问b[1][0]来检索'21'
  3. 访问嵌套列表是否涉及性能损失?因此,将列表a拆分为单独的列表是否有任何好处,或者我这样做只会导致RAM损失?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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