【问题标题】:Is there any way to replace nested For loop with Higher order methods in scala有没有办法用scala中的高阶方法替换嵌套的For循环
【发布时间】:2019-04-13 09:30:09
【问题描述】:

我有一个 mutableList 并希望获取其所有行的总和,并根据某些标准将其行替换为其他一些值。下面的代码对我来说工作正常,但我想问有没有办法摆脱嵌套的 for 循环,因为 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<- 0 to nVect -1) {
    for (j <- i +1 to nVect -1) {
      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
      }
    }
  }
}

【问题讨论】:

  • 这里最大的性能问题是通过索引访问List 的元素。把MutableList改成Array应该会快很多。
  • 如果您正在寻找性能,我是否建议您使用专门构建的数值处理库,例如 Breeze:github.com/scalanlp/breeze
  • @Tim 是的,这也是一个有效的观点,但主要关注的是 for 循环,当我们谈论并行性时,for 循环是阻碍的主要原因。
  • 我们不是在谈论并行性。或者更确切地说,您在问题的任何地方都没有提到并行性。也许你需要重新考虑你在问什么?此外,这段代码中没有循环,只是对foreach的函数调用。

标签: scala


【解决方案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 可以在计算完所有交叉和后在第二遍中完成,那么它的并行性会好得多,但显然这也会改变结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 2023-03-27
    • 2020-01-06
    • 2022-11-18
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多