2017-02-25 108 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 

我希望我可以幫助別人。