2017-08-05 14 views
2

次のコードは、ほぼ永遠に取ります理解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が個別にサイズにマップされている(したがってガベージコレクションされていますか)?

答えて

2

あなたの前提は正しいです。最初のスニペットでは、10.000 Seqのインスタンスを作成し、それ以降は2回目の繰り返しでインスタンスをサイズにマッピングします。 2番目のスニペットでは、それぞれを保存する必要はありません(そのサイズだけに興味があるので)。しかし、追加の反復は必要ありません。明確にするために

、のは、メソッドチェーンなしでそれを見てみましょう:

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 
関連する問題