我想优化这段代码( scala spark)以删除for循环。我该怎么做呢?
var varianceExplained = Array[(Int,Double)]();
var varExplained = Array[(Double)]();//{This one contains double values assigned before}
var sums = 0.00
for(x<-0 to varExplained.length-1)
{sums =sums+varExplained(x)
varianceExplained +:= (x,sums)
}发布于 2017-03-31 02:34:44
不太确定如何并行化依赖于前一个值的集合……我唯一能补充的就是如何根据函数式编程的最佳实践删除循环并使其成为递归函数。
def go(acc: Array[(Int, Double)], iter: Int, sums: Double): Array[(Int, Double)] ={
if (iter == varExplained.length)acc
else {
go((iter, sums+varExplained(iter)) +: acc, iter+1, sums+varExplained(iter))
}
}
go(Array[(Int, Double)](), 0, 0)发布于 2018-05-03 12:56:15
一种可能的解决方案是将for循环转换为map的翻译。您可以尝试以下操作:
val varianceExplained = varExplained.map(elem => (elem, sums+varExplained(elem)))。
在这种情况下,您不需要varianceExplained阵列。map操作的结果是获得所需的Array[(Int, Double)]。我在工作中使用了类似的策略来提高代码的效率。此外,请尝试在代码中使用vals而不是vars。
https://stackoverflow.com/questions/36876436
复制相似问题