对于某些算法,我一遍又一遍地操作同一个列表(或其后缀),我正在访问length
。但是,除此之外,我只访问head
和tail
,因此我不需要随机访问。优化访问长度的最佳方法是什么?
length
是否已在内部缓存(可能是lazy val
?)?我应该在List
周围写一个包装器吗?我可以用特质做到这一点,这是一个很好的解决方案吗?我应该使用另一个集合类,例如Vector
吗?
答案 0 :(得分:1)
对于List
,length
和size
在TraversableOnce
和LinearSeqOptimized
中定义,它们由可变集合共享,因此无法缓存它们。如果您搜索val length
或val size
的标准库来源,则不会显示任何集合类成员。
您不能将List
子类化,因为它是sealed
,但如果您愿意,可以将其包装。需要做更多工作才能允许map
等等,同时保留大小。
case class WrappedList[A](list: List[A]) {
lazy val length = list.length
}
Vector
似乎是一个不错的选择。 length
不是严格缓存,但定义为:
def length = endIndex - startIndex
endIndex
和startIndex
是私有构造函数val,使其比List#length
快得多。如果没有看到有问题的算法,就很难就使用哪种集合类型提出进一步的建议。