Try adding type hints. Assuming all-zips returns a list of strings: (defn all-zips-MD5 [] "Returns a lazy list of all possible American zipcodes, as MD5 digests." (let [digester (java.security.MessageDigest/getInstance "MD5")] (map (fn [#^java.util.String to-digest] (.update digester (.getBytes to-digest)) (String. (.digest digester))) (all-zips))))
I think this will work. You might have to explicitly define the mapping function. On Jun 5, 10:56 am, Daniel Jomphe <danieljom...@gmail.com> wrote: > I need to generate a list of all possible American zipcodes, MD5- > digested. Later on, I will need to do much more involving stuff, > processor-wize, with this. But already, generating a naive list of all > possible zipcodes is taking quite a deal of time: > > user> (time (dorun (take 1000000 (all-zips)))) > "Elapsed time: 3294.478 msecs" > nil > user> (time (dorun (take 1000000 (all-zips-MD5)))) > "Elapsed time: 28150.076 msecs" > nil > > If I allow the whole all-zips to be realized, it takes nearly 1 hour. > I have tried a few optimizations, but before proceeding any further > with it, I wondered if you'd have any advice re: idiomatic clojure and > optimization. > > Here's my code: > > (defn all-zips-MD5 [] > "Returns a lazy list of all possible American zipcodes, as MD5 > digests." > (let [digester (java.security.MessageDigest/getInstance "MD5")] > (map > (fn [to-digest] > (.update digester (.getBytes to-digest)) > (String. (.digest digester))) > (all-zips)))) > > (defn all-zips [] > "Returns a lazy list of all possible American zipcodes." > (let [zips5 (zip-formatted-range 5) > zips4 (zip-formatted-range 4) > cross-prod-zips4 (fn [zip5] (map #(str zip5 "-" %) zips4)) > zips5-4 (mapcat cross-prod-zips4 zips5)] > (concat zips5 zips5-4))) > > (defn zip-formatted-range [n-digits] > "Returns a lazy list of stringified numbers, which are pre-padded > with zeroes, starting from 0 and going up to the max number that can > be represented with a number of digits of n-digits. Thus, if n-digits > is 3, it will produce [001, 002, ... 999]." > (let [zip-formatter #(format (str "%0" n-digits "d") %) > n-to-format (Math/pow 10 (dec n-digits)) > n-max (Math/pow 10 n-digits)] > (concat (map zip-formatter (take n-to-format (range n-max))) > (map str (drop n-to-format (range n-max)))))) --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---