[Tutor] Loop comparison

Stefan Behnel stefan_ml at behnel.de
Fri Apr 16 09:38:23 CEST 2010


Ark, 16.04.2010 08:50:
> A friend of mine suggested me to do the next experiment in python and Java.
>
> It's a simple program to sum all the numbers from 0 to 1000000000.
>
> result = i = 0
> while i<  1000000000:
>      result += i
>      i += 1
> print result

I hope you are aware that this is a) a very lousy benchmark and b) very 
unidiomatic Python code.


> The time for this calculations was huge.  It took a long time to give
> the result.  But, the corresponding program in Java takes less than 1
> second to end.  And if in Java, we make a simple type check per cycle,
> it does not take more than 10 seconds in the same machine.  I was not
> expecting Python to be faster than Java, but it''s too slow.  Maybe
> Java optimizes this case and Python doesn't.  Not sure about this.}

Exactly. A compiler for a statically compiled language can see that the 
above loop yields a constant result, so it can calculate the result in 
advance (or at least reduce the loop overhead for the calculation) instead 
of generating code for the loop as it stands.

The CPython runtime isn't particularly smart about arithmetic. You should 
first put the above loop into a function, which will speed it up 
considerably. Then, try the above code with psyco (a specialising JIT 
compiler). Or give PyPy a try, which should also be pretty good in this.

You can also try to run the code through Cython, which is (more or less) a 
Python compiler that supports static type annotations. You could write it 
like this (which is also a much more pythonic implementation):

     import cython

     @cython.locals(result=cython.longlong, i=cython.longlong)
     def add():
         result = 0
         for i in xrange(1000000000):
             result += i
         return result

     print add()

This runs in less than half a second on my machine, including the time to 
launch the CPython interpreter. I doubt that the JVM can even start up in 
that time.

Stefan



More information about the Tutor mailing list