I'll second the use of core.matrix. It's a wonderful, idiomatic, fast library, and I hope to see folks continue to rally around it.
On Monday, December 22, 2014 3:47:59 AM UTC-7, Mikera wrote: > > For most array operations (e.g. dot products on vectors), I strongly > recommend trying out the recent core.matrix implementations. We've put a > lot of effort into fast implementations and a nice clean Clojure API so I'd > love to see them used where it makes sense! > > For example vectorz-clj can be over 100x faster than a naive map / reduce > implementation: > > (let [a (vec (range 10000)) > b (vec (range 10000))] > (time (dotimes [i 100] (reduce + (map * a b))))) > "Elapsed time: 364.590211 msecs" > > (let [a (array :vectorz (range 10000)) > b (array :vectorz (range 10000))] > (time (dotimes [i 100] (dot a b)))) > "Elapsed time: 3.358484 msecs" > > On Monday, 22 December 2014 17:31:41 UTC+8, Henrik Eneroth wrote: >> >> Interesting read Jose, thanks! >> >> It might be interesting to try a transducer on >> >> (defn dot-prod >> "Returns the dot product of two vectors" >> [v1 v2] >> (reduce + (map * v1 v2))) >> >> if you can get your hands on the 1.7 alpha and the time and inclination >> to do it. Transducers have shown to be faster than running functions in >> sequence. Although I don't know how likely they are to beat native arrays, >> probably not very much. >> >> >> On Sunday, December 21, 2014 7:10:41 PM UTC+1, Jose M. Perez Sanchez >> wrote: >>> >>> >>> Regarding the speed optimizations, execution time for a given model was >>> reduced from 2735 seconds to 70 seconds, over several versions by doing >>> several optimizations. >>> >>> The same calculation implemented in C# takes 12 seconds using the same >>> computer and OS. Maybe the Clojure code can still be improved, but for the >>> time being I'm happy with the Clojure version being six times slower, since >>> the new software has many advantages. >>> >>> For these tests the model was the circle with radius 1 using the >>> "diffmr1" tracker, the simulation was run using 10000 particles and 10000 >>> total random walk steps. >>> >>> These modifications in the critical parts of the code accounted for most >>> of the improvement: >>> >>> - Avoid reflection by using type hints. >>> - Use Java arrays. >>> - In some cases call Java arithmetic functions directly instead of >>> Clojure ones. >>> - Avoid using partial functions in the critical parts of the code. >>> >>> Avoiding lazyness did not help much. Regarding the use of Java arrays, >>> there are many small functions performing typical vector operations on >>> arrays, such as the following example: >>> >>> Using Clojure types: >>> >>> (defn dot-prod >>> "Returns the dot product of two vectors" >>> [v1 v2] >>> (reduce + (map * v1 v2))) >>> >>> Using Java arrays: >>> >>> (defn dot-prod-j >>> "Returns the dot product of two arrays of doubles" >>> [^doubles v1 ^doubles v2] >>> (areduce v1 i ret 0.0 >>> (+ ret (* (aget v1 i) >>> (aget v2 i))))) >>> >>> >>> This gives a general idea of which optimizations helped the most. These >>> changes are not in the public repository, since previous commits have been >>> omitted because the code code was not ready for publication (different >>> license disclaimer, contained email addresses, etc.). If anyone is >>> interested in the diffs and the execution times over several optimizations, >>> please contact me. >>> >>> Kind regards, >>> >>> Jose. >>> >>> >>> On Sunday, December 21, 2014 3:38:35 AM UTC-5, Jose M. Perez Sanchez >>> wrote: >>>> >>>> >>>> Hi everyone: >>>> >>>> Sorry that it has taken so long. I've just released the software in >>>> GitHub under the EPL. It can be found at: >>>> >>>> https://github.com/iosephus/gema >>>> >>>> >>>> Kind regards, >>>> >>>> Jose. >>>> >>>> -- 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.