haskell中的并行映射

是否有一些替代
map
并行地评估列表?我不需要它懒惰。 类似的事情:
pmap :: (a -> b) -> [a] -> [b]
让我
pmap expensive_function big_list
并让我的核心都达到100%。     
已邀请:
是的,请参阅并行包:
ls `using` parList rdeepseq
将通过
rdeepseq
策略并行评估列表中的每个元素。请注意,如果您的元素太便宜而无法并行评估每个元素,那么使用具有良好块值的
parListChunk
可能会提供更好的性能(因为它可以节省每个元素的火花)。 编辑:基于你的问题,我觉得我应该解释为什么这是一个答案。这是因为Haskell很懒惰!考虑一下这句话
let bs = map expensiveFunction as
没有评估任何东西。你刚刚创建了一个映射
expensiveFunction
的thunk。那么我们如何并行评估呢?
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
    
除了像汤姆所描述的那样自己使用显式策略,并行包也会输出
parMap
 parMap :: Strategy b -> (a -> b) -> [a] -> [b]
策略参数类似于
rdeepseq
。 在par-monad包中也有
parMap
(你走出纯粹的Haskell,进入一个平行的monad):
 parMap :: NFData b => (a -> b) -> [a] -> Par [b]
这里记录了par-monad包。     

要回复问题请先登录注册