Hi!

I was doing some project euler problems and I wrote the following
code. It is really slow, and I would like to know why and how it can
be made faster. Not that I care much about this code in particular,
but I want to understand Clojure better.

    (def vs (int-array 4000001))
    (def ss (boolean-array 4000001))

    (defn sk [k]
      (if (aget ss k)
        (aget vs k)
        (let [ans
              (if (< k 56)
                (- (mod (+ 100003 (- (* k 200003)) (* 300007 k k k))
1000000) 500000)
                (- (mod (+ (sk (- k 24)) (sk (- k 55))) 1000000)
500000))]
          (do (aset vs k ans) (aset ss k true) ans))))

    (time (dorun (map sk (range 100000))))

The call above takes 20 seconds, which is surprisingly slow (at least
to me). The "same thing" in Python it takes under under 1 (not sure
exactly how long). Why so slow?

The python version I tried:

    data = [None]*4000001

    def sk(k):
            if data[k] is None:
                    if k <= 55:
                            ans = ((100003 - 200003 * k + 300007 *
k**3) % 1000000) - 500000
                    else:
                            ans = ((data[k-24] + data[k-55] + 1000000)
% 1000000) - 500000
                    data[k] = ans
                    return ans
            else:
                    return data[k]

    a = map(sk, range(100000)) ; almost instant

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