39

是否有一些替代品map可以并行评估列表?我不需要它懒惰。

类似于:pmap :: (a -> b) -> [a] -> [b]让我pmap expensive_function big_list拥有 100% 的核心。

4

2 回答 2

44

是的,请参阅并行包

ls `using` parList rdeepseq

rdeepseq将通过策略并行评估列表中的每个元素。请注意,parListChunk如果您的元素太便宜而无法获得并行评估每个元素的好处(因为它可以节省每个元素的火花),则使用具有良好块值的使用可能会提供更好的性能。

编辑:根据你的问题,我觉得我应该解释为什么这是一个答案。这是因为 Haskell 很懒!考虑声明

let bs = map expensiveFunction as

没有进行任何评估。您刚刚创建了一个映射的 thunk expensiveFunction。那么我们如何并行评估它呢?

let bs = map expensiveFunction as
    cs = bs `using` parList rdeepseq

现在不要bs在未来的计算中使用该列表,而是使用该cs列表。IOW,您不需要并行映射,您可以使用常规(惰性)映射和并行评估策略。

编辑:如果您环顾四周,您会看到parMap函数执行我在此处显示的操作,但封装在一个辅助函数中。

针对您的评论,以下代码对您不起作用吗?这个对我有用。

import Control.Parallel.Strategies

func as =
        let bs = map (+1) as
            cs = bs `using` parList rdeepseq
        in cs
于 2011-04-09T16:17:10.163 回答
20

除了像 Tom 所描述的那样自己使用显式策略外,并行还导出parMap

 parMap :: Strategy b -> (a -> b) -> [a] -> [b]

策略参数类似于rdeepseq.

And there's also parMap in the par-monad package (you step out of pure Haskell, and into a parallel monad):

 parMap :: NFData b => (a -> b) -> [a] -> Par [b]

The par-monad package is documented here.

于 2011-04-09T17:30:06.587 回答