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
-~----------~----~----~----~------~----~------~--~---

Reply via email to