Cla*_*bel 33 parallel-processing haskell multicore combinators
是否有一些替代品map并行评估列表?我不需要它懒惰.
类似的东西:pmap :: (a -> b) -> [a] -> [b]让我pmap expensive_function big_list拥有100%的核心.
Tho*_*son 38
是的,请参阅并行包:
ls `using` parList rdeepseq
Run Code Online (Sandbox Code Playgroud)
将通过rdeepseq策略并行评估列表中的每个元素.请注意,parListChunk如果您的元素太便宜而无法并行评估每个元素,那么使用具有良好块值的方法可能会提供更好的性能(因为它可以节省每个元素的火花).
编辑:基于你的问题,我觉得我应该解释为什么这是一个答案.这是因为Haskell很懒惰!考虑一下这句话
let bs = map expensiveFunction as
Run Code Online (Sandbox Code Playgroud)
没有评估任何东西.你刚刚创建了一个映射的thunk expensiveFunction.那么我们如何并行评估呢?
let bs = map expensiveFunction as
cs = bs `using` parList rdeepseq
Run Code Online (Sandbox Code Playgroud)
现在不要bs在将来的计算中使用该cs列表,而是使用该列表.IOW,你不需要一个平行地图,你可以使用常规(懒惰)地图和一个并行的评估策略.
编辑:如果你环顾四周,你会看到parMap函数,它执行我在这里展示但包装成一个辅助函数.
在回复您的评论时,以下代码不适合您吗?这个对我有用.
import Control.Parallel.Strategies
func as =
let bs = map (+1) as
cs = bs `using` parList rdeepseq
in cs
Run Code Online (Sandbox Code Playgroud)
Don*_*art 18
除了像Tom所描述的那样自己使用显式策略,并行包也会导出parMap:
parMap :: Strategy b -> (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)
战略论证的地方就像rdeepseq.
而且还有parMappar-monad包(你走出纯Haskell,进入并行monad):
parMap :: NFData b => (a -> b) -> [a] -> Par [b]
Run Code Online (Sandbox Code Playgroud)
在PAR-单子包记录在这里.
| 归档时间: |
|
| 查看次数: |
10658 次 |
| 最近记录: |