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
更像是一种鸦片