我有一个mutableList,并且想要取其所有行的总和,并根据某些标准将其行替换为其他一些值。下面的代码对我来说很好用,但是我想问问有什么方法可以摆脱嵌套的for循环,因为for循环会降低性能。我想使用Scala高阶方法,而不是嵌套的for循环。我尝试了flodLeft()高阶方法来替换单个for循环,但是无法实现替换嵌套的for循环
n1
答案 0 :(得分:1)
此代码中没有“ for循环”; for
语句已被编译器转换为foreach
调用,因此它已在使用高阶方法。这些foreach
调用可以显式地写出来,但对性能没有影响。
先编译代码,然后清理它,即可得出以下结论:
def func(nVect: Int, nDim: Int): Unit = {
val vector = Array.fill(nVect, nDim)(math.random)
for {
i <- 0 until nVect
j <- i + 1 until nVect
} {
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
可以在计算完所有的交叉和之后第二遍完成,那么它会更可并行化,但是显然这也会改变结果。