scala条件替换_scala - 有没有办法用scala中的高阶方法替换嵌套的For循环 - SO中文参考 - www.soinside.com...
有沒有辦法用scala中的高階方法替換嵌套的For循環
問題描述 投票:0回答:1
我有一個mutableList,并希望獲取所有行的總和,并根據某些條件將其行替換為其他值。下面的代碼對我來說工作正常,但我想問有沒有辦法擺脫嵌套的for循環,因為循環會降低性能。我想使用scala高階方法而不是嵌套for循環。我嘗試了flodLeft()更高階的方法來替換單個for循環但是無法實現替換嵌套for循環
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個回答
1
投票
這段代碼中沒有“for循環”; for語句已被編譯器轉換為foreach調用,因此它已經使用了高階方法。這些foreach調用可以明確寫出,但它對性能沒有任何影響。
使代碼編譯然后清理它給出了:
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
}
}
}
請注意,使用單個for對結果沒有任何影響,它看起來更好!
此時很難進一步改進。唯一可能的并行性是內部map調用,但矢量化這幾乎肯定是一個更好的選擇。如果choice很昂貴,那么結果可能會被緩存,但是當vector更新時,需要更新此緩存。
如果choice可以在計算完所有交叉總和之后的第二遍中完成,那么它將更加平行,但顯然也會改變結果。
熱門問題
總結
以上是生活随笔為你收集整理的scala条件替换_scala - 有没有办法用scala中的高阶方法替换嵌套的For循环 - SO中文参考 - www.soinside.com...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将pdf转换html_pdf文件怎么转换
- 下一篇: layui列表显示缩略图_layUI实现