我正在學習Haskell,所以我試圖實現移動平均函數。這是我的代碼:在Haskell中計算移動平均值
mAverage :: Int-> [Int] -> [Float]
mAverage x a = [fromIntegral k/fromIntegral x | k <- rawAverage]
where
rawAverage = mAverage' x a a
-- First list contains original values; second list contains moving average computations
mAverage' :: Int -> [Int] -> [Int] -> [Int]
mAverage' 1 a b = b
mAverage' x a b = mAverage' (x - 1) a' b'
where
a' = init a
b' = zipWith (+) a' (tail b)
其中用戶爲每個平均和值的列表(例如mAverage 4 [1,2..100]
)的長度調用mAverage。
但是,當我在輸入mAverage 4 [1,2..100000]
上運行代碼時,我得到它在ghci中需要3.6秒(使用:set +s
),並使用了千兆字節的內存。這對我來說似乎效率很低,因爲Python中的等效函數只需要幾分之一秒。有什麼方法可以讓我的代碼更高效?
注意:'初始化了'是_O(長度)_,有點貴。實現滑動窗口以便將其移出一個項目是恆定的時間將是很好的。 – 9000
GHCi不應該用於任何與性能有關的東西。我建議'ghc -O2'或'jhc'。 –
做滑動窗口的一種方法是將第一個總和作爲「Float」傳遞,傳入原始列表(用於從當前總和中減去)和原始列表,其中k個條目被丟棄(用於添加到當前總和)。然後,下一個和是傳入的總和減去減法列表的第一個元素加上加法列表的第一個元素。 –