gpt4 book ai didi

list - 处理 scala.collections.parallel 中令人惊讶的 ParList 缺失问题

转载 作者:行者123 更新时间:2023-12-04 02:41:16 25 4
gpt4 key购买 nike

所以 Scala 2.9 最近出现在 Debian 测试中,带来了新奇的并行集合。

假设我有一些代码相当于

  def expensiveFunction(x:Int):Int = {...}

def process(s:List[Int]):List[Int} = s.map(expensiveFunction)

现在从我在文档实际出现在我的机器上之前收集到的关于并行集合的一点点开始,我期望通过将列表切换到 ParList 来并行化它。 ...但令我惊讶的是,没有! (只是 ParVectorParMapParSet ...)。

作为一种解决方法,这(或单行等效项)似乎工作得很好:
  def process(s:List[Int]):List[Int} = {
val ps=scala.collection.parallel.immutable.ParVector()++s
val pr=ps.map(expensiveFunction)
List()++pr
}

在我的测试代码中产生了大约 x3 的性能改进,并实现了更高的 CPU 使用率(四核加超线程 i7)。但它似乎有点笨拙。

我的问题是一种汇总:
  • 为什么没有ParList ?
  • 鉴于没有 ParList , 有没有
    我应该采用更好的模式/习语,以便
    我不觉得他们失踪了?
  • 我只是在“落后于时代”使用 Lists a
    在我的 Scala 程序中很多(就像我所有的 Scala 书籍一样)
    2.7天买回来教我)和
    我实际上应该更多地利用Vectors ? (我的意思是在 C++ 领域
    我通常需要一个很好的理由来使用std::list超过 std::vector )。
  • 最佳答案

    List当您想要模式匹配(即 case x :: xs )并进行有效的前置/迭代时, s 非常有用。但是,当您想要快速按索引访问、分割成 block 或加入(即 xs ::: ys )时,它们就不是很好了。

    因此,当您认为这种事情(拆分和合并)正是高效并行所需要的东西时(拥有一个并行的 List )没有多大意义。采用:

    xs.toIndexedSeq.par

    关于list - 处理 scala.collections.parallel 中令人惊讶的 ParList 缺失问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642210/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com