In the same repl as the above benchmarks, and yes, this is definitely the best so far. I'll have to remember reduce-kv for future usage.
user> (crit/bench (persistent! (reduce-kv (fn [acc k v] (assoc! acc k (inc v))) (transient {}) testmap))) Evaluation count : 369540 in 60 samples of 6159 calls. Execution time mean : 163.806692 µs Execution time std-deviation : 1.090315 µs Execution time lower quantile : 162.145827 µs ( 2.5%) Execution time upper quantile : 165.628330 µs (97.5%) Overhead used : 2.203076 ns nil On Saturday, February 1, 2014 8:34:52 PM UTC-8, Michał Marczyk wrote: > > Oh, sorry, for some reason Gmail didn't alert me to some of the recent > messages coming in while I was viewing this thread. > > > On 2 February 2014 05:32, Michał Marczyk <michal....@gmail.com<javascript:> > > wrote: > >> I'd expect >> >> (persistent! >> (reduce-kv (fn [acc k v] (assoc! acc k (inc v))) >> (transient {}) >> input-map)) >> >> to be the fastest solution. >> >> Cheers, >> Michał >> >> >> On 2 February 2014 05:30, Justin Smith <noise...@gmail.com >> <javascript:>>wrote: >> >>> Excellent, thanks for the information. >>> >>> I just did a benchmark of zipmap over keys and vals vs. into {} over a >>> map, and despite my intuition, they are actually nearly identical in >>> performance. So if zipmap were using transients zipmap with keys and vals >>> would actually be the better performing option here. >>> >>> user> (def testmap (zipmap (range 1000) (range 2000 3000))) >>> user> (crit/bench (zipmap (keys testmap) (map inc (vals testmap)))) >>> Evaluation count : 150900 in 60 samples of 2515 calls. >>> Execution time mean : 401.458681 µs >>> Execution time std-deviation : 4.912358 µs >>> Execution time lower quantile : 393.882254 µs ( 2.5%) >>> Execution time upper quantile : 409.534676 µs (97.5%) >>> Overhead used : 2.203076 ns >>> >>> Found 1 outliers in 60 samples (1.6667 %) >>> low-severe 1 (1.6667 %) >>> Variance from outliers : 1.6389 % Variance is slightly inflated by >>> outliers >>> nil >>> user> (crit/bench (into {} (map (fn [[k v]] [k (inc v)]) testmap))) >>> Evaluation count : 150060 in 60 samples of 2501 calls. >>> Execution time mean : 400.684810 µs >>> Execution time std-deviation : 3.489015 µs >>> Execution time lower quantile : 395.127605 µs ( 2.5%) >>> Execution time upper quantile : 407.132405 µs (97.5%) >>> Overhead used : 2.203076 ns >>> nil >>> >>> >>> On Saturday, February 1, 2014 8:22:28 PM UTC-8, Ambrose >>> Bonnaire-Sergeant wrote: >>> >>>> It also might help to notice KeySeq defines first/next, but never >>>> explicitly walks the seq. >>>> >>>> That's left to the user of the KeySeq. >>>> >>>> Thanks, >>>> Ambrose >>>> >>>> >>>> On Sun, Feb 2, 2014 at 12:18 PM, Michał Marczyk >>>> <michal....@gmail.com>wrote: >>>> >>>> On 2 February 2014 05:14, Justin Smith <noise...@gmail.com> wrote: >>>>> >>>>>> Pardon my ignorance but if this is producing a lazy result, how is it >>>>>> doing so? >>>>>> https://github.com/clojure/clojure/blob/ >>>>>> dff9600387b962f16fc78e6477e10e34651fd366/src/jvm/clojure/ >>>>>> lang/APersistentMap.java#L134 >>>>>> >>>>> >>>>> APersistentMap's KeySeq.create and ValSeq.create are pretty much >>>>> equivalent to (map key entry-seq) and (map val entry-seq). The logic >>>>> producing entry-seq lives in the individual map types and is indeed lazy. >>>>> >>>>> Cheers, >>>>> Michał >>>>> >>>>> >>>>>> >>>>>> On Saturday, February 1, 2014 7:54:32 PM UTC-8, Ambrose >>>>>> Bonnaire-Sergeant wrote: >>>>>> >>>>>>> zipmap could also potentially use transients (which would be a nice >>>>>>> addition). >>>>>>> >>>>>>> keys/vals are also lazy, so I would be surprised if there was any >>>>>>> performance >>>>>>> difference with walking the seq "twice". >>>>>>> >>>>>>> Thanks, >>>>>>> Ambrose >>>>>>> >>>>>>> >>>>>>> On Sun, Feb 2, 2014 at 11:35 AM, Justin Smith <noise...@gmail.com>wrote: >>>>>>> >>>>>>>> Realistically, how many situations are there where running keys and >>>>>>>> vals independently is preferable to running seq once and using the two >>>>>>>> element vectors that returns? >>>>>>>> >>>>>>>> Usually this way one can avoid walking the whole thing twice. >>>>>>>> >>>>>>>> (into {} (map (fn [[k v]] [k (inc v)]) {:a 0 :b 1})) is >>>>>>>> representative of the idiom I usually use. As a bonus, into uses >>>>>>>> transients, which can create the resulting structure in fewer cycles / >>>>>>>> less >>>>>>>> time. >>>>>>>> >>>>>>>> >>>>>>>> On Saturday, February 1, 2014 10:00:33 AM UTC-8, Sam Ritchie wrote: >>>>>>>> >>>>>>>>> Looks like Rich just chimed in with: >>>>>>>>> >>>>>>>>> "keys order == vals order == seq order " >>>>>>>>> >>>>>>>>> Matching Socks >>>>>>>>> January 31, 2014 7:31 PM >>>>>>>>> Actually, http://dev.clojure.org/jira/browse/CLJ-1302 "keys and >>>>>>>>> vals consistency not mentioned in docstring" was declined, with the >>>>>>>>> comment >>>>>>>>> "The absence of this property in the docs is correct. You should not >>>>>>>>> rely >>>>>>>>> on this." >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wednesday, August 11, 2010 6:03:39 PM UTC-4, Chouser wrote: >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "Clojure" group. >>>>>>>>> To post to this group, send email to clo...@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+u...@googlegroups.com >>>>>>>>> >>>>>>>>> For more options, visit this group at >>>>>>>>> http://groups.google.com/group/clojure?hl=en >>>>>>>>> --- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "Clojure" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to clojure+u...@googlegroups.com. >>>>>>>>> >>>>>>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Sam Ritchie (@sritchie) >>>>>>>>> Paddleguru Co-Founder >>>>>>>>> 703.863.8561 >>>>>>>>> www.paddleguru.com >>>>>>>>> Twitter <http://twitter.com/paddleguru> // >>>>>>>>> Facebook<http://facebook.com/paddleguru> >>>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "Clojure" group. >>>>>>>> To post to this group, send email to clo...@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+u...@googlegroups.com >>>>>>>> For more options, visit this group at >>>>>>>> http://groups.google.com/group/clojure?hl=en >>>>>>>> --- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "Clojure" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to clojure+u...@googlegroups.com. >>>>>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>>>>> >>>>>>> >>>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> To post to this group, send email to clo...@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+u...@googlegroups.com >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/clojure?hl=en >>>>>> --- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to clojure+u...@googlegroups.com. >>>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Clojure" group. >>>>> To post to this group, send email to clo...@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+u...@googlegroups.com >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/clojure?hl=en >>>>> --- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Clojure" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to clojure+u...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>> >>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@googlegroups.com<javascript:> >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> clojure+u...@googlegroups.com <javascript:> >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+u...@googlegroups.com <javascript:>. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >> >> > -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.