scala条件替换_scala - 有没有办法用scala中的高阶方法替换嵌套的For循环 - SO中文参考 - www.soinside.com...
有沒有辦法用scala中的高階方法替換嵌套的For循環(huán)
問題描述 投票:0回答:1
我有一個(gè)mutableList,并希望獲取所有行的總和,并根據(jù)某些條件將其行替換為其他值。下面的代碼對(duì)我來說工作正常,但我想問有沒有辦法擺脫嵌套的for循環(huán),因?yàn)檠h(huán)會(huì)降低性能。我想使用scala高階方法而不是嵌套for循環(huán)。我嘗試了flodLeft()更高階的方法來替換單個(gè)for循環(huán)但是無法實(shí)現(xiàn)替換嵌套for循環(huán)
def func(nVect : Int , nDim : Int) : Unit = {
var Vector = MutableList.fill(nVect,nDimn)(math.random)
var V1Res =0.0
var V2Res =0.0
var V3Res =0.0
for(i
for (j
var resultant = Vector(i).zip(Vector(j)).map{case (x,y) => x + y}
V1Res = choice(Vector(i))
V2Res = choice(Vector(j))
V3Res = choice(resultant)
if(V3Res > V1Res){
Vector(i) = res
}
if(V3Res > V2Res){
Vector(j) = res
}
}
}
}
scala
1個(gè)回答
1
投票
這段代碼中沒有“for循環(huán)”; for語句已被編譯器轉(zhuǎn)換為foreach調(diào)用,因此它已經(jīng)使用了高階方法。這些foreach調(diào)用可以明確寫出,但它對(duì)性能沒有任何影響。
使代碼編譯然后清理它給出了:
def func(nVect: Int, nDim: Int): Unit = {
val vector = Array.fill(nVect, nDim)(math.random)
for {
i
j
} {
val res = vector(i).zip(vector(j)).map { case (x, y) => x + y }
val v1Res = choice(vector(i))
val v2Res = choice(vector(j))
val v3Res = choice(res)
if (v3Res > v1Res) {
vector(i) = res
}
if (v3Res > v2Res) {
vector(j) = res
}
}
}
請(qǐng)注意,使用單個(gè)for對(duì)結(jié)果沒有任何影響,它看起來更好!
此時(shí)很難進(jìn)一步改進(jìn)。唯一可能的并行性是內(nèi)部map調(diào)用,但矢量化這幾乎肯定是一個(gè)更好的選擇。如果choice很昂貴,那么結(jié)果可能會(huì)被緩存,但是當(dāng)vector更新時(shí),需要更新此緩存。
如果choice可以在計(jì)算完所有交叉總和之后的第二遍中完成,那么它將更加平行,但顯然也會(huì)改變結(jié)果。
熱門問題
總結(jié)
以上是生活随笔為你收集整理的scala条件替换_scala - 有没有办法用scala中的高阶方法替换嵌套的For循环 - SO中文参考 - www.soinside.com...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将pdf转换html_pdf文件怎么转换
- 下一篇: 笨办法学python47详解_练习 47