1

根据我的阅读,在定义序列时应该更喜欢使用通用 Seq 而不是特定的实现,例如Listor Vector

虽然我的部分代码主要用于完全遍历(映射、过滤等),而我的代码的某些部分将使用相同的序列进行索引操作(indexOf、lastIndexWhere)。

在第一种情况下,我认为使用LinearSeq(implem is List) 更好,而在第二种情况下,使用IndexedSeq(implem is Vector) 更好。

我的问题是:我是否需要在我的代码中显式调用转换方法toListtoIndexedSeq还是以智能方式在后台完成转换?IndexedSeq如果我使用这些转换,在和之间来回切换是否会降低性能LinearSeq

提前致谢

4

2 回答 2

1

Vector几乎总是会跑赢List。除非你的算法只使用::,headtail,Vector会比List. 使用List更多是关于您的算法的概念性问题(数据是堆栈结构的,仅访问头/尾,仅通过前置添加元素,使用模式匹配(可以与 一起使用Vector,我觉得使用它更自然List))。

你可能想看看为什么我应该在 scala 中使用向量

现在比较一些不错的数字(显然不是“真正的”基准,但是嗯):

val l = List.range(1,1000000)
val a = Vector.range(1,1000000)

import System.{currentTimeMillis=> milli}

val startList = milli
l.map(_*2).map(_+2).filter(_%2 == 0)
println(s"time for list map/filter operations : ${milli - startList}")

val startVector = milli
a.map(_*2).map(_+2).filter(_%2 == 0)
println(s"time for vector map/filter operations : ${milli - startVector}")

输出 :

time for list map/filter operations : 1214  
time for vector map/filter operations : 364

编辑:刚刚意识到这实际上并不能回答你的问题。据我所知,您必须自己调用 toList/toVector。至于表演,这取决于你的顺序,但除非你一直来回走动,否则这应该不是问题。

再一次,不是一个严肃的基准,而是:

val startConvToList = milli
a.toList
println(s"time for conversion to List: ${milli - startConvToList}")

val startConvToVector = milli
l.toVector
println(s"time for conversion to Vector: ${milli - startConvToVector}")

输出 :

time for conversion to List: 48
time for conversion to Vector: 18
于 2013-08-28T10:06:29.600 回答
0

我对 indexOf 做了同样的事情,而且 Vector 的性能也更高

val l = List.range(1,1000000)
val a = Vector.range(1,1000000)

import System.{currentTimeMillis=> milli}

val startList = milli
l.indexOf(500000)
println("time for list index operation : " + (milli - startList))

val startVector = milli
a.indexOf(500000)
println("time for vector index operation : " + (milli - startVector))

输出 :

time for list index operation : 36
time for vector index operation : 33

所以我想我应该在内部实现中一直使用 Vector,但是当我按照这里指定的方式构建接口时我必须使用 Seq: Seq 和 List 之间的区别

于 2013-08-28T14:23:40.803 回答