我刚开始学习Scala,所以请耐心等待:-)
我有一个关于reduceLeft行为的问题.这是一个例子:
List(1, 2, 3, 4, 5) reduceLeft (_ + _)
Run Code Online (Sandbox Code Playgroud)
我想知道计算是否可以同时进行,例如:
第一回合:
第二轮:
第三轮:
如果我只使用reduce函数而不是reduceLeft,那至少就是我期望发生的事情.或者reduceLeft真的只做一次减少吗?
((((1 + 2) + 3) + 4) + 5)
Run Code Online (Sandbox Code Playgroud)
这基本上意味着它不能并行执行,如果可能的话,应该总是倾向于减少reduceLeft/Right?
Rég*_*les 10
答案是肯定的,这很简单:
List(1, 2, 3, 4, 5).par.reduce (_ + _)
Run Code Online (Sandbox Code Playgroud)
该par方法将列表转换为并行集合.当您调用reduce此并行集合时,它将并行执行.
请参阅并行收集文档
正如您所注意到的那样,reduceLeft它不可并行化,因为它明确假设一个非关联的形式:(B,A) => B.
只要使用关联运算符,reduce就可以并行化.
还有一个带有两个函数的foldLeft被称为模拟aggregate函数:一个用于映射为可组合的形式,另一个是用于合并元素的关联函数: (B,A)=>B, (B,B) => B.
这个,只要两个函数在输出上达成一致,并且你可以在任何你想要的地方混合零,就可以并行化了.
所以,如果你想能够并行,
reduceLeft/Right -> reduce
foldLeft/Right -> aggregate
Run Code Online (Sandbox Code Playgroud)
在某些情况下,可能会有reduce更多限制,reduceLeft但aggregate会做到这一点.
也就是说,这只能使声明能够并行.因为它实际上是并行的,你需要使用一个继承自的集合ParIterable,并且这些集合都有Par它们的名称:ParVector等等.获得并行集合的最简单方法是调用.par常规集合(.seq另一种方式,从平行于非平行).它是这样做的,因为除了速度之外,通常没有理由保持并行,但并行性增加了开销.因此,如果有足够的工作要做,你应该只能并行操作,而你可能知道,编译器可能不会.因此,您要明确选择所需的集合类型.(并行集合返回并行,顺序返回顺序.)
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |