2017-02-25 57 views
2
import Data.List 

genkstrings :: Int -> [String] -> [String] 
genkstrings k [] = [] 
genkstrings 1 (s:ss) = [ [c] | c <- s ] ++ genkstrings 1 ss 
genkstrings k (s:ss) 
    | length (s:ss) < k = [] 
    | otherwise = concat [kStartWith k c ss | c <- s ] 
       ++ 
       genkstrings k ss 

kStartWith k c ss = 
map (c :) $ genkstringsNogap (k-1) ss 

genkstringsNogap 0 _ = [] 
genkstringsNogap 1 (s:ss) = [ [c] | c <- s ] 
genkstringsNogap k (s:ss) = concat $ [kStartWithNoGap k c ss | c <- s ] 

kStartWithNoGap k c ss = map (c:) (genkstringsNogap (k-1) ss) 

输入:genkstrings 2 ["sds","ghghg"]哈斯克尔并行编程

输出:

["sg","sh","sg","sh","sg","dg","dh","dg","dh","dg","sg","sh","sg","sh","sg"] 

我学习Haskell,我发现我可以运行我的代码并行。我在书中发现了一些我正在阅读的示例,但我不明白我该如何应用并行编程。

,如果我是正确的,我应该把它在这条线

| otherwise = concat [kStartWith k c ss | c <- s ] 
        ++ 
        genkstrings k ss 

我该怎么办呢?

+2

我怀疑你可以通过并行化这个功能赢得很多。这里没有太多有趣的计算,性能受到所有这些列表的高速缓存性能的限制。至少切换到['Text'](http://hackage.haskell.org/package/text)或['Bytestring'](http://hackage.haskell.org/package/bytestring),然后再考虑更特殊的最佳化。 – leftaroundabout

回答

0

我现在看到您的文章。有很多方法可以进行并行计算。

你可以读这三个库:

Control.Parallel

Control.Parallel.Strategies

Control.Monad.Par(对于单子)

然后,我要用就用两种方式:

right `par` 
left `pseq` 
left ++ right 

result `using` strategy 
    where 
    result = losort ++ (x:hisort) 
    losort = quicksortP1 [y|y <- xs, y < x] 
    hisort = quicksortP1 [y|y <- xs, y >= x] 
    strategy = parList rseq 

这里的一些结果:

-- parList rpar  -- 2m42s N=4 
-- parList rseq  -- 38.3s N=4 
-- parList r0  -- 57.3s N=4 
-- parList rdeepseq -- 2m40s N=4 
-- r0    -- 48.5s N=4 

,如果你想获得深:)

result = losort ++ (x:hisort) 
    (losort,hisort) = 
     (quicksortP2 [y|y <- xs, y < x] 
     , quicksortP2 [y|y <- xs, y >= x] 
    ) `using` strategy 
    strategy = 
      parTuple2 rdeepseq rdeepseq -- 17.9s N=4 
--    parTuple2 rdeepseq rseq -- 18.0s N=4    
--    parTuple2 rdeepseq r0 -- 42s N=4 
--    parTuple2 rseq  rseq -- 23.8s N=4 
--    parTuple2 rpar  rpar -- 26.9s N=4 
--    parTuple2 r0  r0 -- 47.6s N=4 
--    r0      -- 46.2s N=4 

其中N是我所使用的处理器的数量。

因此,知道它,你可以很容易地适应它。

而且编译:

> ghc MyProg.hs -threaded -rtsopts 
> ./MyProg +RTS -N4 -s 

我希望我可以帮助别人。