是否有一些替代品map
可以并行评估列表?我不需要它懒惰。
类似于:pmap :: (a -> b) -> [a] -> [b]
让我pmap expensive_function big_list
拥有 100% 的核心。
是否有一些替代品map
可以并行评估列表?我不需要它懒惰。
类似于:pmap :: (a -> b) -> [a] -> [b]
让我pmap expensive_function big_list
拥有 100% 的核心。
是的,请参阅并行包:
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
除了像 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.