Sorry for what I guess is a pretty basic question. I've written for practice a simple function that takes a sequence of numbers and returns a map with the odd and even ones. No big deal:

    (defn separate-nums [coll]
      (hash-map :even (filter even? coll) :odd (filter odd? coll)))

But I thought that I actually filter the same sequence two times (one for taking out odd numbers and another one for even ones). So, why don't write a "procedural" version and see how it compares to the functional one?

    (defn separate-nums-it [coll]
      (loop [odd [] even [] nums coll]
        (let [n (first nums)]
          (if (nil? n)
            (hash-map :even even :odd odd)
            (if (even? n)
             (recur odd (conj even n) (rest nums))
             (recur (conj odd n) even (rest nums)))))))

Weeping for the second version, I wrote a quick&dirty timing test:

    (let [nums (range 65536)]
      (do (time (separate-nums nums))
          (time (separate-nums-it nums))))

The output surprised me:

    "Elapsed time: 0.083074 msecs"
    "Elapsed time: 51.026659 msecs"

Following my previous reasoning, iterating over a sequence of numbers only once should have been faster... What I'm missing? The iterative version is so bad? I see that the filter function source code is much more complex than I thought, so maybe there are important optimizations in there.


--
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