기본값이 아닌 (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 쓰레기 - 끝내기 전에 포기했습니다.)에서도 오류가 발생합니다.
가장 빠른 방법은'Data.Vector.Unboxed'로 전환하는 것입니다. 단순히'stArray size = size id'를 생성하는 것입니다. – leftaroundabout
leftaroundabout : 네가 맞습니다. Data.Vector.Unboxed는 두 배 빠릅니다. 당신이 그것을 하나의 것으로 바꾸면 당신의 답을 받아 들일 것입니다 :-) – mbrodersen
'Data.Vector.Unboxed.generate'는 어떻게 비교됩니까? –