Piy*_*ush 10 performance scala for-comprehension
我有一个关于scala中for-comprehension效率的问题.
当perm是大约550个元素的列表时,以下代码大约需要45秒
perm = some list
for{
perm <- perms.withFilter(_.size > 0)
wordList = somefunction(perm) //expensive operation, wordlist is a list of strings
sentenceList = somefunction1(perm) //very expensive operation, sentenceList is a list of list of strings
word <- wordList
sentence <- sentenceList
} yield { word::sentence}
Run Code Online (Sandbox Code Playgroud)
当我将以下代码更改为以下代码时,它使用相同的烫发列表在3秒内运行
perm = some list
for{
perm <- perms.withFilter(_.size > 0)
word <- somefunction(perm) //expensive operation
sentence <- somefunction1(perm) //very expensive operation
} yield { word::sentence}
Run Code Online (Sandbox Code Playgroud)
性能的差异是否与Scala中的延迟评估有关?
dre*_*xin 11
让我们去理解这两种理解:
1.)
perms.withFilter(_.size > 0).flatMap { perm =>
val wordList = somefunction(perm) //expensive operation
val sentenceList = somefunction1(perm) //very expensive operation
wordList.flatMap { word =>
sentenceList.map { sentence =>
word::sentence
}
}
}
Run Code Online (Sandbox Code Playgroud)
2.)
perms.withFilter(_.size > 0).flatMap { perm =>
somefunction(perm).flatMap { word =>
somefunction1(perm).map { sentence =>
word :: sentence
}
}
}
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,每次都会执行两种昂贵的功能.在第二种情况下,当somefunction(perm)返回空结果时,somefunction1(perm)将永远不会执行.
| 归档时间: |
|
| 查看次数: |
570 次 |
| 最近记录: |