了解 scala 集合执行



下面的代码几乎需要很长时间:

val r =(1 to 10000)
.map(_ => Seq.fill(10000)(0.0))
.map(_.size)
.sum

虽然这非常快:

val r =(1 to 10000)
.map(_ => Seq.fill(10000)(0.0).size)
.sum

为什么? 我不明白语句的执行顺序。在第一种情况下,是否首先创建了大小为 10000 的 10000 个 Seq,然后创建了所有映射到该大小的 Seq?还是每个 Seq 单独映射到大小(从而收集垃圾(?

你的假设是正确的。在第一个代码段中,您创建了 10.000 个Seq实例,只有在第二次迭代中,这些实例才会映射到其大小。在第二个代码段中,不仅不需要存储每个Seq(因为您只对它们的大小感兴趣(,而且也不需要额外的迭代。

为了清楚起见,让我们看看没有方法链接:

val range = (1 to 10000)
val a1 = range.map(_ => Seq.fill(10000)(0.0)) // all collections are maintained in memory
val a2 = a1.map(_.size)
val b = range.map(_ => Seq.fill(10000)(0.0).size) // each collection can be thrown away asap

最新更新