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