Scala 切片最快的收集方式是什么?

Scala 切片最快的收集方式是什么?,scala,scala-collections,Scala,Scala Collections,我需要执行以下操作: collection.slice(x, y) .... collection.slice(x+1, y+1) ... collection.slice(x+n, y+n) 或 通常这部分代码的执行是预期的,所以我希望尽可能快地执行。我应该选择什么收藏?(可以是不可变的) “应用”页上的p.S.特性负责切片 p.p.S.正在寻找关于该主题的文章和手册。答案在某种程度上取决于x和y的距离,但通常最好使用普通阵列。如果您不需要对切片执行任何操作,则使用视图可能会更快,但使用视图

我需要执行以下操作:

collection.slice(x, y)
....
collection.slice(x+1, y+1)
...
collection.slice(x+n, y+n)

通常这部分代码的执行是预期的,所以我希望尽可能快地执行。我应该选择什么收藏?(可以是不可变的)

“应用”页上的p.S.特性负责切片


p.p.S.正在寻找关于该主题的文章和手册。

答案在某种程度上取决于x和y的距离,但通常最好使用普通阵列。如果您不需要对切片执行任何操作,则使用视图可能会更快,但使用视图访问速度较慢,因此最好远离它们

无论如何,您肯定想要快速“应用”(对数或恒定时间)的东西,在
Array
Vector
ArrayBuffer
之间,
Array
最快,
ArrayBuffer
大约慢50%,而
Vector
对于切片和使用已切片的每个元素来说,速度大约是原来的两倍


也可以考虑<代码>滑动< /代码>是否会做你想做的事情。它没有直接切片那么快,但是非常方便。

嗯,
Vector
具有
logN
性能,尽管常数因子可能太大,取决于您的需求


另一方面,也许
range
符合您的要求?如果是这样的话,
SortedMap
很可能以较小的常数因子提供
logN
性能。也许。

哈希表能满足您的需要吗?应用是索引。答案在很大程度上取决于除了切片之外您还需要什么操作,以及切片上需要什么操作。特别是,您将要进行切片吗?已排序的贴图切片速度非常慢。@Rex真的吗?我编写了代码来修复RB树上的
range
,它是
O(logN)
。另一方面,提交了一个临时修复程序,它是
O(n)
。我想知道2.8.1的代码是什么。“我想你已经测试过了?”丹尼尔-他们切得很慢<代码>范围仅比
向量
(非视图)切片慢2倍,如果覆盖整个序列,则与任何
滑动
解决方案相当。(顺便说一句,
slice
现在几乎普遍被索引视图破坏——我已经提交了一张罚单。)@Rex啊,是的。我说如果
range
有效,那么它可能是另一种选择。例如,首先找到键,然后在索引上做一个
切片
——它本来可能是
范围
d。@Daniel-或者您可以
zipWithIndex
来获取键并处理值。但它比人们可能会使用的集合上的原始
切片
要慢得多。这是相当病态的,
范围
切片
快得多……人们会期望两者具有相似的性能。(感谢您确保其中至少有一个是快速的!)>“如果您不需要对切片执行任何操作”,您的意思是在使用切片之前过滤/映射结果切片?请解释。我的意思是你需要它们存在,但你基本上不需要访问内容。如果需要访问内容,创建新数组通常比通过视图重定向更快。(特别是因为这种类型的视图现在被破坏了……但即使它们被修复了,你也有额外的间接性。)一般来说,当你实际上不打算使用你正在查看的所有内容时,视图是好的——如果你全部使用(特别是多次使用),那么拷贝通常会更快。如果只能使用零件,则视图通常会更快。(由于存在错误,这里没有,但在大多数情况下。)
collection.slice(x-n, y-n)