访问嵌套列表中元素的最快方法是什么?
What is the fastest way to access elements in a nested list?
我有一个由三层组成的列表,出于说明目的看起来像这样:
a = [[['1'],['2'],['3'],['']],[['5'],['21','33']]]
因此我有一个顶部列表,其中包含几个其他列表,每个列表又包含列表。
第一层将包含数十个列表。下一层可能包含数百万个列表,底层将包含空字符串、单个字符串或少量值(每个都是字符串)。
我现在需要访问最底层的值,并将它们按特定顺序存储在新列表中,这是在循环内完成的。访问这些值的最快方法是什么?使用的内存量不是我最关心的问题(尽管我显然也不想浪费它)。
我可以想到两个办法:
- 我直接访问列表
a
以检索所需的值,例如a[1][1][0]
会 return '21'
.
- 我创建了
a
元素的副本,然后访问这些元素以进一步展平列表。因此,在这种情况下,例如:b=a[0]
、c=a[1]
所以我现在将访问 b[1][0]
而不是访问 a[1][1][0]
来检索 '21'
.
访问嵌套列表是否会影响性能?因此,将列表 a
拆分成单独的列表是否有任何好处,或者我这样做只是招致 RAM 惩罚?
通过索引访问元素(即:a[1][1][0])是一个 O(1) 操作:source。你不会比这更快。
现在,赋值也是一个 O(1) 操作,因此就速度而言,您描述的两种方法之间没有区别。第二个实际上不会引起任何内存问题,因为对列表的分配是通过引用,而不是通过复制(除非您明确告诉它否则)。
这两种方法或多或少是相同的,因为 b=a[0]
仅将另一个名称绑定到该索引处的列表。它不会复制列表。也就是说,唯一的区别是,在你的第二种方法中,唯一的区别是你除了访问嵌套列表之外,你最终会抛出引用。所以,理论上,它会稍微慢一点。
正如@joaquinlpereyra 所指出的,Python Wiki 列出了此类操作的复杂性:https://wiki.python.org/moin/TimeComplexity
所以,长话短说:只访问列表项会更快。
我有一个由三层组成的列表,出于说明目的看起来像这样:
a = [[['1'],['2'],['3'],['']],[['5'],['21','33']]]
因此我有一个顶部列表,其中包含几个其他列表,每个列表又包含列表。
第一层将包含数十个列表。下一层可能包含数百万个列表,底层将包含空字符串、单个字符串或少量值(每个都是字符串)。
我现在需要访问最底层的值,并将它们按特定顺序存储在新列表中,这是在循环内完成的。访问这些值的最快方法是什么?使用的内存量不是我最关心的问题(尽管我显然也不想浪费它)。
我可以想到两个办法:
- 我直接访问列表
a
以检索所需的值,例如a[1][1][0]
会 return'21'
. - 我创建了
a
元素的副本,然后访问这些元素以进一步展平列表。因此,在这种情况下,例如:b=a[0]
、c=a[1]
所以我现在将访问b[1][0]
而不是访问a[1][1][0]
来检索'21'
.
访问嵌套列表是否会影响性能?因此,将列表 a
拆分成单独的列表是否有任何好处,或者我这样做只是招致 RAM 惩罚?
通过索引访问元素(即:a[1][1][0])是一个 O(1) 操作:source。你不会比这更快。
现在,赋值也是一个 O(1) 操作,因此就速度而言,您描述的两种方法之间没有区别。第二个实际上不会引起任何内存问题,因为对列表的分配是通过引用,而不是通过复制(除非您明确告诉它否则)。
这两种方法或多或少是相同的,因为 b=a[0]
仅将另一个名称绑定到该索引处的列表。它不会复制列表。也就是说,唯一的区别是,在你的第二种方法中,唯一的区别是你除了访问嵌套列表之外,你最终会抛出引用。所以,理论上,它会稍微慢一点。
正如@joaquinlpereyra 所指出的,Python Wiki 列出了此类操作的复杂性:https://wiki.python.org/moin/TimeComplexity
所以,长话短说:只访问列表项会更快。