This patch optimizes the stdDev function in two respects:
- first, we don't do sum . map which builds an intermediate list, but
instead use a fold over the list to build incrementally the sum;
this should reduce both the time and space characteristics, as we
have fewer objects created
- second, we move from “a ^ 2” to “a * a” as the latter has a much
simpler implementation and thus a higher performance
Since the ‘square’ function is obsoleted by the above the patch also
removes it.
meanValue :: Floating a => [a] -> a
meanValue lst = sum lst / fromIntegral (length lst)
--- | Squaring function
-square :: (Num a) => a -> a
-square = (^ 2)
-
-- | Standard deviation.
stdDev :: Floating a => [a] -> a
stdDev lst =
let mv = meanValue lst
- av = sum $ map (square . (\e -> e - mv)) lst
+ av = foldl' (\accu elem -> let d = elem - mv in accu + d * d) 0.0 lst
bv = sqrt (av / fromIntegral (length lst))
in bv