下面的代码几乎要花很长时间:
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 单独映射到大小(从而被垃圾收集)?
最佳答案
你的假设是正确的。在第一个代码段中,您创建了 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
关于scala - 了解 scala 集合执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45522330/