On Mon, May 9, 2011 at 6:55 PM, Andy Fingerhut <andy.finger...@gmail.com> wrote:
> (ns movavg
>  (:gen-class))
>
> (set! *warn-on-reflection* true)
>
>
> (defn sliding-window-moving-average [window lst]
>  (let [w (int window)
>        w-1 (int (dec w))]
>    (loop [rolling-sum (apply + (take w lst))
>           last-w (object-array (take w lst))

This is mutated in place and recurred with itself, so you can just
move it to the outer let (to some spot after w's initialization, of
course). That might afford a minor speedup, but not if the JIT is
optimizing away the repeated assignment of the reference to itself. It
will make the code a bit more concise and clear.

>           i (int 0)
>           avgs (transient [(/ rolling-sum w)])
>           lst (drop w lst)]

You might get a significant speedup with
             lst (seq (drop w lst))]
here and

>      (if-let [lst (seq lst)]

        (if lst
here and

>        (let [old-val (aget last-w i)
>              new-val (first lst)
>              next-rolling-sum (- (+ rolling-sum new-val) old-val)]
>          (aset last-w i new-val)
>          (recur next-rolling-sum
>                 last-w
>                 (if (== i w-1) (int 0) (inc i))
>                 (conj! avgs (/ next-rolling-sum w))
>                 (rest lst)))

                   (next lst)))
here. Calling seq is fairly expensive.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to