Hi Dmitriy, There's also an alternative zipper implementation called *fast-zip* [1] which seems to be 5 times faster than *clojure.zip*. Although if *clojure.walk* is faster in an order of magnitude or more than *clojure.zip*, then *fast-zip* won't be much of an improvement.
Cheers, Juan [1]: https://github.com/akhudek/fast-zip On Thursday, December 4, 2014 5:05:40 AM UTC-3, Dmitriy Morozov wrote: > > Thanks! clojure.zip is convinient but slow, I used clojure.walk and it > turned to be several times faster in my case. > > On Wednesday, December 3, 2014 10:48:18 PM UTC+2, Jony Hudson wrote: >> >> If I understand right, I think you might be able to use the existing >> replace functions in clojure.walk. I find that this is about twice as fast: >> >> (time >> (dotimes >> [_ 100000] >> (walk/postwalk-replace >> {"exp_1" 100 "exp_2" 20 "exp_3" 5} >> [:DIV [:ADD [:ID "P1" "exp_1"] [:ID "P2" "exp_2"] "exp_2419"] [:ID >> "P3" "exp_3"] "exp_2418"]))) >> >> >> Jony >> >> On Wednesday, 3 December 2014 18:49:01 UTC, Dmitriy Morozov wrote: >>> >>> Hi, guys! >>> >>> I have an issue with my function where I use zippers to modify data >>> structure. The function modifies a tree (parsed grammar tree) to replace >>> expressions with values from a given map. Sadly, the algorithm I came up >>> with is pretty slow. I would appreciate if anyone can give me a hint on >>> what would be the right approach to do what I'm trying to accomplish. >>> Thanks! >>> >>> (defn- transform-values [parse-tree values-map] >>> "Replaces all expressions in parsed tree with values from a given map." >>> (loop [loc (zip/vector-zip parse-tree)] >>> (if (zip/end? loc) >>> (zip/root loc) >>> (if (zip/branch? loc) >>> (let [id (last (zip/children loc))] >>> (if (contains? values-map id) >>> (recur (zip/next (zip/replace loc (zip/node [(get >>> values-map id)])))) >>> (recur (zip/next (zip/edit loc #(into [] (butlast %))))))) >>> (recur (zip/next loc))) >>> ))) >>> (time >>> (dotimes >>> [_ 100000] >>> (transform-values >>> [:DIV [:ADD [:ID "P1" "exp_1"] [:ID "P2" "exp_2"] "exp_2419"] [:ID "P3" >>> "exp_3"] "exp_2418"] >>> {"exp_1" 100 "exp_2" 20 "exp_3" 5}))) >>> >>> "Elapsed time: 2317.491 msecs" >>> >>> >>> >>> -- 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/d/optout.