Scala 如何将输入序列中的所有值并行求和?

Scala 如何将输入序列中的所有值并行求和?,scala,Scala,我正在研究这个函数,它应该以并行方式对输入序列中的所有值求和,以利用多个核 代码: 您只需使用sum: val source = (1 to 2000000).par source.sum 如果需要使用parallelSum,则在访问时应锁定累加器,以保护代码不受运行map的线程之间的争用条件的影响: def parallelSum(list: scala.collection.parallel.ParSeq[Int]): Int = { var accumulator = 0

我正在研究这个函数,它应该以并行方式对输入序列中的所有值求和,以利用多个核

代码:


您只需使用
sum

val source = (1 to 2000000).par
source.sum
如果需要使用
parallelSum
,则在访问时应锁定
累加器
,以保护代码不受运行
map
的线程之间的争用条件的影响:

def parallelSum(list: scala.collection.parallel.ParSeq[Int]): Int = {
    var accumulator = 0
    list.foreach(x => synchronized(accumulator += x))
    accumulator
}

但我不认为这是最好的方法。

你可以使用
sum

val source = (1 to 2000000).par
source.sum
如果需要使用
parallelSum
,则在访问时应锁定
累加器
,以保护代码不受运行
map
的线程之间的争用条件的影响:

def parallelSum(list: scala.collection.parallel.ParSeq[Int]): Int = {
    var accumulator = 0
    list.foreach(x => synchronized(accumulator += x))
    accumulator
}

但我认为这不是最好的方法。

在集合的并行版本上使用
聚合
,并将合并操作定义为中间和的总和,例如

xs.par.aggregate(0)(_+_,_+_)

注意
Int
上的
+
是关联的和可交换的,因此我们可以并行组合(求和)中间求和。在上面的表达式中,第一个
+
生成中间加法,第二个合并(并行)。

在集合的并行版本上使用
聚合
,并将合并操作定义为中间和的和,例如

xs.par.aggregate(0)(_+_,_+_)

注意
Int
上的
+
是关联的和可交换的,因此我们可以并行组合(求和)中间求和。在上面的表达式中,第一个
+
生成中间加法,第二个合并(并行)。

@progx您很好。顺便说一句,由于您正在使用
map
将函数应用于所有
list
元素,仅用于其副作用,
foreach
更为重要apropiate@progx你会来的。顺便说一句,由于您正在使用
map
将函数应用于所有
list
元素,仅用于其副作用,
foreach
更像是一种鸦片