ok, those times make sense. The times are at least half the speed from the single pass, and more so because no recursion.
So you have to do "dorun" to force the evaluation of each list? I was wondering about this, too. If you had done doall on the answer, it wouldn't have been a "deep execution", if you will. It would have just made sure you had two entries in the outer list . . . nevermind whether they were fully expanded? Also, I see how "do" was used to add "nil" as the return in filt-rem. I guess it wasn't needed in the second one because of the doruns? Do folks in the contrib group like this new implementation? On Sun, Jan 25, 2009 at 3:41 PM, Stuart Sierra <the.stuart.sie...@gmail.com>wrote: > > Hi e, > > Most of the time is taken up by printing, which is why you see the > same times. Here's an example that gives the results you would expect. > > user> (def numbers (doall (take 500000 (repeatedly #(rand-int > 3000))))) > #'user/numbers > user> (defn predicate [x] (< x 1500)) > #'user/predicate > user> (dotimes [i 5] > (time (do (filt-rem predicate numbers) nil))) > "Elapsed time: 1028.112 msecs" > "Elapsed time: 715.832 msecs" > "Elapsed time: 923.726 msecs" > "Elapsed time: 631.364 msecs" > "Elapsed time: 934.084 msecs" > nil > user> (dotimes [i 5] > (time (let [pair (separate predicate numbers)] > (dorun (first pair)) > (dorun (second pair))))) > "Elapsed time: 2694.912 msecs" > "Elapsed time: 2818.482 msecs" > "Elapsed time: 3087.375 msecs" > "Elapsed time: 2992.607 msecs" > "Elapsed time: 2959.005 msecs" > nil > > > -Stuart Sierra > > > > On Jan 25, 10:02 am, e <evier...@gmail.com> wrote: > > The IRC channel folks helped me implement what we discovered was > > already called "separate" in contribs. My point was to do a partition > > that generated the two lists "(passes pred)" and "(fails pred)" in one > > pass without recursion. > > > > We ended up with: > > > > (defn filt-rem [pred coll] > > (loop [l1 () l2 () [f & r] coll] > > (if f > > (if (pred f) > > (recur (conj l1 f) l2 r) > > (recur l1 (conj l2 f) r)) > > (list l1 l2)))) > > > > -- the name reaming "filter and remove", I was thinking > > > > There's some branching there, so perhaps it's not the most efficient > > code. > > > > Here's what's in contrib, and as Tim showed me in the pquicksort > > discussion, that last bit could be replaced by "remove": > > > > (defn separate > > "Returns a vector: > > [ (filter f s), (filter (complement f) s) ]" > > [f s] > > [(filter f s) (filter (complement f) s)]) > > > > Well, the recursive one that does two passes blows away filt-rem, > > according to 'time'. But if I just count in my head, they both take > > about as long. > > > > Yes, I started throwing doall all over the place. The other thing is > > we definately aren't talking about milliseconds. I.m not trying to > > measure how much time is spent in the reader or compiler or whatever. > > I care about the user waiting for the answer, and that's what I'm > > trying to time. > > > > Here's what I'm seeing, even though I don't believe it: > > > > (def l1 (doall (take 50000 (repeatedly #(rand-int 3000))))) ;;; I > > don't know if doall goes there, just shotgunning it at this point > > > > (time (filt-rem #(< % 1500) (doall l1))) ;;;; I've tried doall in > > various places with no help > > "Elapsed time: 63.158 msecs" <------ no way. It took like 12 > > seconds > > > > (time (separate #(< % 1500) (doall l1))) ;;;;;; doall here > > actually did something even though already done above > > "Elapsed time: 12.701 msecs" <----------- no way. 12 seconds, I > > counted. Definitely longer than 12 msecs. > > > > Questions: > > > > 1) Is there anything wrong with filt-rem or anything to improve it? > > 2) why are the times reportedly so different when I can tell they > > return in about the same amount of time? > > > > Thanks. > > > --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---