有没有办法用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可以在计算完所有交叉总和之后的第二遍中完成,那么它将更加平行,但显然也会改变结果。
热门问题