Why is this loop heavy code so slow in Python? Possible Project Euler spoilers

Arnaud Delobelle arnodel at googlemail.com
Sun Sep 2 10:53:29 EDT 2007


On Sep 2, 12:51 pm, jwrweather... at gmail.com wrote:
[...]
> The resulting executable takes 0.24 seconds to run. I'm not expecting
> a scripting language to run faster than native code, but I was
> surprised at how much slower it was in this case. Any ideas as to what
> is causing python so much trouble in the above code?

Sorry I didn't answer your question at all in my previous post
(although my modified method gets the answer in about 6s on a measly
PB G4 1GHz :).
Your little code snippet is just about the worst bit of code for
python to be compared to C.  Three loops, only integer arithmetic:
that's not going to make Python shine!

Nevertheless as you optimise your C snippet (-O3), there are probably
a few things that the compiler does for you:

* as in the inner loop, a*a + b*b always remain the same, it is
probably stored in a register once and for all
* in the second loop, a*a remains the same so it might be calculated
once and for all as well.

It gives this:

M = 1000
solutions = [0] * M

def f1():
    "Your original implementation"
    for a in xrange(1, M):
        for b in xrange(1, M - a):
            for c in xrange(1, M - a - b):
                if a**2 + b**2 == c**2:
                    solutions[a+b+c] += 1

def f2():
    "a*a + b*b precalculated"
    for a in xrange(1, M):
    a2 = a*a
        for b in xrange(1, M - a):
            s = a2 + b*b
            for c in xrange(1, M - a - b):
                if s == c*c:
                    solutions[a+b+c] += 1

It doesn't make it as quick as C of course, but more than halves the
execution time.

--
Arnaud





More information about the Python-list mailing list