我正在学习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函数时,需要传入每个平均数的长度和值列表(例如mAverage 4 [1,2..100]
)。
但是,当我在输入mAverage 4 [1,2..100000]
时,在ghci中运行代码需要3.6秒,并且使用1GB内存。这对我来说效率非常低下,因为在Python中等效的函数只需要几分之一秒。有没有办法让我的代码更加高效?
init a
的时间复杂度为 _O(length a)_,有点昂贵。最好实现滑动窗口,这样将其向前移动一个项的时间是常数时间。 - 9000ghc -O2
或者jhc
。 - Thomas M. DuBuisson