scala - 了解 scala 集合执行

标签 scala collections

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

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/

相关文章:

scala - 使用 Http4s 的 Circe 编码器和解码器

java - Kryo:readClassAndObject/ReadObject 和 WriteClassAndObject/WriteObject 之间的区别

java - 如何检查字符串包含集合中的字符串之一

java - 为什么 Java 集合中的 contains()/indexOf() 使用 o.equals(e) 而不是 e.equals(o)?

java - 为什么 List<generic> 在 mybatis 与 java 的情况下不起作用?

json - Play JSON可选转换器

scala - 模拟 Scala ParStream

scala - 未找到请求的操作 : [timestamp <-> java. lang.Long] 的编解码器

ruby - Ruby 中集合是如何定义的?

.net - 需要帮助理解 TreeNodeCollection 的 .Net Collection 行为