带有可变列表的Scala性能问题(LinkedList)

时间:2013-11-14 10:18:01

标签: scala

我有以下代码片段:代码读取系统(Linux)字典(en)文件并将其保存在内存列表中。

代码1 :(使用可变列表)

  val word = scala.collection.mutable.LinkedList[String]("init");

  for(line <- Source.fromFile("/usr/share/dict/words").getLines()){
    val s : String = line.trim()

    if( // some checks
    ){
      word append scala.collection.mutable.LinkedList[String](s) 
    }

  }

代码2 :(使用不可变列表)

var word = List[String]()

  for(line <- Source.fromFile("/usr/share/dict/words").getLines()){
    val s : String = line.trim()

    if( // some checks
    ){
      word ::= s
    }

  }

代码2:几乎立即返回,但是 代码1:永远需要。

任何人都可以帮助我,为什么要花这么多时间来制作可变的List? 。我们应该使用Mutable吗?还是我做错了什么?

使用的Scala版本:2.10.3

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

word append scala.collection.mutable.LinkedList[String](s) 

遍历word列表,然后在最后添加其他列表中的项目。

word ::= s

在单词列表的前面附加s,并将新列表分配给单词变量。

与在前面添加项目相比,追加到列表末尾总是很昂贵。

答案 1 :(得分:1)

在第一个示例中,您将重复添加到列表的末尾(追加)。这需要时间按照列表的长度顺序。在第二个示例中,您将添加到列表的开头(::)。这需要恒定的时间。因此,第一个示例的执行时间随着文件中行数的平方而增加,第二个示例的执行时间随着文件的长度线性增加。

这是由于链表的性质,链表是不可变List和可变LinkedList的数据结构。链接列表在前面快速访问,在后面访问速度慢。