2014-05-10 2 views
1

기본값이 아닌 (0이 아닌) 값으로 Haskell에서 불변의 배열을 초기화하는 가장 빠른 방법일까요? 다음 예제에서는 배열을 0에서 (size-1)까지의 값으로 간단히 초기화합니다.Haskell에서 불변 unboxed int 배열을 초기화하는 가장 빠른 방법은 무엇입니까?

지금까지 가장 빠릅니다 (아래 Code.ST의 두 배 속도). leftaroundabout에 감사 :

... 
import qualified Data.Vector.Unboxed as V 

stArray :: Int -> V.Vector Int 
stArray size = 
    V.generate size id 
... 

내 가장 빠른 원본 :

module Code.ST where 

import Data.Array.MArray 
import Data.Array.ST 
import Data.Array.Unboxed 

stArray :: Int -> UArray Int Int 
stArray size = 
    runSTUArray $ newArray (0,size-1) 0 >>= f 0 
    where 
     f i a 
     | i >= size = return a 
     | otherwise = writeArray a i i >> f (i + 1) a 

stMain :: IO() 
stMain = do 
    let size = 340000000 
    let a  = stArray size 
    putStrLn $ "Size: " ++ show size ++ " Min: " ++ show (a ! 0) ++ " Max: " ++ show (a ! (size - 1)) 

내가 그 일의 간단한 불변의 방법을 시도하고 내 PC (YMMV)에 2 ~ 3 배 느리다. 또한 Repa를 시도했지만 크기가 340000000보다 작은 어레이 (많은 HD 쓰레기 - 끝내기 전에 포기했습니다.)에서도 오류가 발생합니다.

+3

가장 빠른 방법은'Data.Vector.Unboxed'로 전환하는 것입니다. 단순히'stArray size = size id'를 생성하는 것입니다. – leftaroundabout

+0

leftaroundabout : 네가 맞습니다. Data.Vector.Unboxed는 두 배 빠릅니다. 당신이 그것을 하나의 것으로 바꾸면 당신의 답을 받아 들일 것입니다 :-) – mbrodersen

+0

'Data.Vector.Unboxed.generate'는 어떻게 비교됩니까? –

답변

2

시도해 보셨습니까 listArrayData.Array.Unboxed? 당신은 다음과 같이 사용할 수 있습니다 : 당신은 당신이 동일한 모듈에서 array를 사용할 수있는 좀 더 유연성을 필요로하는 경우

-- listArray :: (Ix i, IArray a e) => (i, i) -> [e] -> a i e 
listArray (0,3) "abcdefgh" :: UArray Int Char 

array (0,3) [(0,'a'),(1,'b'),(2,'c'),(3,'d')] 

을 생성합니다. 나는 정말 빨리인지 아닌지 모르는

array (0,3) [(0,'c'),(1,'a'),(2,'d'),(3,'b')] 

생산,하지만 확실히는 ST 루프 작성으로 손보다 사용하기 더 편리합니다

-- array :: (Ix i, IArray a e) => (i, i) -> [(i, e)] -> a i e 
array (0,3) (zip [1,3,0,2] "abcd") :: UArray Int Char 

.

+0

예 나는 그것을 시도하고 listArray 2 3 배 느린 것입니다. ST 루프를 쓰지 않는 편이 좋지만,이 경우 속도는 편리함보다 중요합니다. – mbrodersen

+0

내 컴퓨터에서'listArray'로 작성된 예제는 ST보다 약 1.5 배 정도 느립니다. 확실히 두 배나 느리지는 않습니다. ;) –

+0

내 PC에 있습니다 :-) 실제 숫자는 특정 CPU, CPU 캐시 크기, 메모리 크기/속도 등에 따라 * 로트 *에 달려 있습니다. – mbrodersen

관련 문제