在Haskell中初始化不可变的未装箱的int数组的最快方法是什么?

时间:2014-05-10 12:21:11

标签: arrays haskell

这是使用非默认(非零)值在Haskell中初始化不可变数组的最快方法吗?在以下示例中,我只是使用从0到(size-1)的值初始化数组。

目前最快(速度是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))

我尝试过更简单的不可改变的方法,它在我的电脑上慢了2到3倍(YMMV)。我也尝试过维修,但是即使是小于34,000000个大小的阵列也是如此(很多高清垃圾 - 我在它完成之前放弃了)。

1 个答案:

答案 0 :(得分:3)

您是否尝试过listArray的{​​{1}}?您可以像这样使用它们:

Data.Array.Unboxed

这将创建

-- 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

哪个会产生

-- 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

我真的不知道它是否快速,但使用手写ST循环肯定更方便。