tst*_*ner 14 scala lazy-evaluation for-comprehension
在Python中,我可以这样做:
lazy = ((i,j) for i in range(0,10000) for j in range(0,10000))
sum((1 for i in lazy))
Run Code Online (Sandbox Code Playgroud)
这需要一段时间,但内存使用是不变的.
scala中的相同构造:
(for(i<-0 to 10000; j<-i+1 to 10000) yield (i,j)).count((a:(Int,Int)) => true)
Run Code Online (Sandbox Code Playgroud)
过了一会儿,我得到了一个java.lang.OutOfMemoryError
,尽管应该懒得评价.
Ben*_*mes 23
对于斯卡拉的理解,没有任何内在的懒惰; 它的语法糖*不会改变你的两个范围的组合将是渴望的事实.
如果你使用view
范围的懒惰,理解的结果也是懒惰的:
scala> for(i<-(0 to 10000).view; j<-(i+1 to 10000).view) yield (i,j)
res0: scala.collection.SeqView[(Int, Int),Seq[_]] = SeqViewN(...)
scala> res0.count((a: (Int, Int)) => true)
res1: Int = 50005000
Run Code Online (Sandbox Code Playgroud)
这里的懒惰与for-comprehension无关,但是因为当在某种类型的容器上调用flatMap
或map
(见下文)时,你会在相同类型的容器中找回结果.因此,for-comprehension将保留你所投入的任何懒惰(或缺乏).
*对于类似的东西:
(0 to 10000).flatMap(i => (i+1 to 10000).map(j => (i, j)))
Run Code Online (Sandbox Code Playgroud)
Dan*_*ral 13
懒惰不是来自理解,而是来自收藏本身.您应该研究集合的严格特征.
但是,对于懒惰的:-),这里是一个摘要:Iterator
并且Stream
是非严格的,就像view
任何集合的选定方法一样.所以,如果你想偷懒,一定要.iterator
,.view
或者.toStream
您的收藏第一.
归档时间: |
|
查看次数: |
4102 次 |
最近记录: |