Scala 使用并行集合就地转换阵列
当一个人拥有一组对象时,通常需要(例如出于性能原因)在适当的位置更新(替换)一些对象。例如,如果您有一个整数数组,您可能希望将负整数替换为正整数:Scala 使用并行集合就地转换阵列,scala,parallel-collections,Scala,Parallel Collections,当一个人拥有一组对象时,通常需要(例如出于性能原因)在适当的位置更新(替换)一些对象。例如,如果您有一个整数数组,您可能希望将负整数替换为正整数: // Faster for primitives var i = 0 while (i < a.length) { if (a(i) < 0) a(i) = -a(i) i += 1 } // Fine for objects, often okay for primitives for (i <- a.indices)
// Faster for primitives
var i = 0
while (i < a.length) {
if (a(i) < 0) a(i) = -a(i)
i += 1
}
// Fine for objects, often okay for primitives
for (i <- a.indices) if (a(i) < 0) a(i) = -a(i)
//原语速度更快
变量i=0
while(i 对于(iSequential mutable collection,顺序可变集合)有一些方法,如transform
,它们可以在适当的位置工作
并行可变集合缺少这些方法,但我不确定这背后有什么原因,或者这只是一个疏忽
我的回答是你现在运气不好,但你当然可以自己写
也许在讨论过这一点之后,提交一份票证是有意义的?创建一个并行集合,将索引保存到数组中进行转换,然后运行foreach,在给定索引的情况下对数组中的一个单元格进行变异
通过这种方式,您还可以拥有更多的控制权,并且可以使四个工作线程在数组的四分之一上工作。因为简单地翻转一个整数符号可能不足以证明并行计算的合理性。就并行数组而言,这是一个疏忽。并行的转换
阵列可能会包含在下一版本中
但是,您可以使用平行范围执行此操作:
for (i <- (0 until a.length).par) a(i) = computeSomething(i)
for(万一有人想知道——尽管看起来我应该知道,但实际上我没有答案(只是猜测),所以这次我不会回答我自己的问题!这取决于数组的大小-如果它真的很大,那么它可能有意义。更正-如果您创建一个平行的索引集合,那么可能不会,但您可以使用ParRange
。