如何从索引开始有效地获取Tcl列表的其余部分?

时间:2009-09-16 17:57:04

标签: list performance tcl

我想获取列表的特定索引之后的所有元素。这可以写成:

set foo {0 1 2 3 4 5 6 <...> n}
puts [lrange $foo 1 [llength $foo]]

然而,计算列表长度似乎是浪费。如果lrange的最后一个参数是可选的并且省略它意味着继续直到列表的结尾,那将是很好的,但是,唉今天不是这样。

在没有计算列表长度的情况下,是否有其他方法可以在Tcl中有效地执行此操作?

2 个答案:

答案 0 :(得分:7)

您可以使用“end”代替“[llength $ foo]”

因此...

把[lrange $ foo 1 end]

答案 1 :(得分:4)

杰克很好地回答了你的实际问题。话虽如此,有一件事值得注意。获取列表的长度(实际上是引擎盖下的列表)是O(1),这意味着它不需要实时。列表本身的长度与元数据一起存储,不会重新计算。唯一的实际成本是函数调用的开销。使用“结束”可能仍然更快,只是没有你想象的那么多。

但“实际上是一个引擎盖下的列表”,我的意思是解释器目前将其视为一个列表(有更深层次的解释,但不值得进入这里)。由于您在值上使用[lrange],解释器必须将其内部转换为列表...因此您几乎可以保证[llength]的O(1)行为。