这是使用非默认(非零)值在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个大小的阵列也是如此(很多高清垃圾 - 我在它完成之前放弃了)。
答案 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循环肯定更方便。