Here's what I have so far. The code splits blocks into 128 smaller sub-arrays, each representing a level, then calls a modified version of frequencies (using areduce instead of reduce) on each level. On my machine, with server mode on, it takes about 20 seconds to compute the frequencies for an array of 99844096 blocks. I haven't tested it on your level, because I'm too lazy to get JNBT set up, but I'm curious to see if it returns the correct result for you.
(def num-levels 128) (defn get-level [level-num ^bytes blocks] (let [size (/ (count blocks) num-levels) output (byte-array size)] (doseq [output-idx (range size)] (let [block-idx (+ (* output-idx num-levels) level-num)] (aset output output-idx (aget blocks block-idx)))) output)) (defn afrequencies [^bytes a] (persistent! (areduce a idx counts (transient {}) (let [x (aget a idx)] (assoc! counts x (inc (get counts x 0))))))) (defn freqs [^bytes blocks] (let [levels (map #(get-level % blocks) (range num-levels))] (map afrequencies levels))) user=> (def blocks (byte-array 99844096)) #'user/blocks user=> (time (count (freqs blocks))) "Elapsed time: 20160.780769 msecs" 128 On Nov 4, 3:28 pm, Pepijn de Vos <pepijnde...@gmail.com> wrote: > Hi all, > > I have written a Python script to analyze Minecraft levels and render a > graph. Then I did the same with Clojure. It takes Python 10 seconds to > analyze a map, while it takes Clojure over a minute. > > After having tried different options without any significant improvement, I > am lost as to why there is such a huge difference. I wouldn't mind an extra > pair of eyes/brains to look at this. > > I blogged about it in more detail > here:http://pepijndevos.nl/clojure-versus-python > Clojure version:https://github.com/pepijndevos/Clomian/ > Python version:https://github.com/l0b0/mian > > Clojure spends most of its time in the freqs function, here are a couple of > variations:https://gist.github.com/663096 > > If you want to run the code yourself, you'll need a Minecraft level and JNBT, > which is not on Maven. > JNBT:http://jnbt.sourceforge.net/ > The level used in the blogpost:http://dl.dropbox.com/u/10094764/World2.zip > > Groeten, > Pepijn de Vos > -- > Sent from my iPod Shufflehttp://pepijndevos.nl -- 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