有什么方法可以在scala中用高阶方法替换嵌套的For循环

时间:2019-04-13 09:30:09

标签: scala

我有一个mutableList,并且想要取其所有行的总和,并根据某些标准将其行替换为其他一些值。下面的代码对我来说很好用,但是我想问问有什么方法可以摆脱嵌套的for循环,因为for循环会降低性能。我想使用Scala高阶方法,而不是嵌套的for循环。我尝试了flodLeft()高阶方法来替换单个for循环,但是无法实现替换嵌套的for循环

n1

1 个答案:

答案 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可以在计算完所有的交叉和之后第二遍完成,那么它会更可并行化,但是显然这也会改变结果。