Speed-up for loops

Michael Kreim michael at perfect-kreim.de
Fri Sep 3 05:21:36 EDT 2010


Hi,

thanks a lot for your answers. I learn a lot and I like to sum up your 
suggestions and show you the results of the time command on my machine:

Original code by me:
imax = 1000000000
a = 0
for i in xrange(imax):
     a = a + 10
print a
=> runs (wall clock time): 1:55.14

Peter Otten suggested to put the code into a function:
def f():
     imax = 1000000000
     a = 0
     for i in xrange(imax):
         a = a + 10
     print a
f()
=> runs (wall clock time):  0:47.69

Tim Wintle and Philip Bloom posted some code using a while loop:
imax = 1000000000
a = 0
i = 0
while 1:
     i = i + 1
     if (i > imax):
         break
     a = a + 10
print a
=> runs (wall clock time):  3:28.05

imax = 1000000000
a = 0
i = 0
while(i<imax):
     a = a + 10
     i = i + 1
print a
=> runs (wall clock time):  3:27.74


Hrvoje Niksic suggested the usage of itertools:
from itertools import repeat
imax = 1000000000
a = 0
for i in repeat(None, imax):
     a = a + 10
print a
=> runs (wall clock time): 1:58.25


I wrote a code combining these:
def f():
     from itertools import repeat
     imax = 1000000000
     a = 0
     for i in repeat(None, imax):
         a = a + 10
     print a
f()
=> runs (wall clock time): 0:43.08

Then Roland Koebler suggested psyco but I am sitting on a 64bit machine 
and so I could not test it (although it looks promising).

An anonymous Nobody suggested to use Numpy. I did not do this, because I 
am very very new to Numpy and I did not figure out a Numpy specific way 
to do this. Maybe a Numpy expert has something for me?

So finally I followed the recommendation of Tim Wintle to use cython. I 
did not know this before, but I figured out the following:
additionWintle2.pyx:
def addition():
     cdef long imax = 1000000000
     cdef long a = 0
     cdef long i
     for i in xrange(imax):
          a = a + 10
     print a

setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("additionWintle2", ["additionWintle2.pyx"])]
setup(
   name = 'Cython test',
   cmdclass = {'build_ext': build_ext},
   ext_modules = ext_modules
)

$ python setup.py build_ext --inplace

run.py:
from additionWintle2 import addition
addition()
running build_ext

=> runs (wall clock time):  0:00.04


And to compare this. I wrote something similar in Matlab and C++ 
(although some authors, pointed out that it is not that easy to compare 
"for" loops in these three languages):
addition.cpp
#include <iostream>
using namespace std;
int main()
{
     long imax = 1e9;
     long a = 0;
     long i;
     for(i=0; i < imax; i++)
     {
         a = a + 10;
     }
     cout << a << endl;
     return 0;
}
=> Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.32

addition.m
imax = 1e9;
a = 0;
for i=0:imax-1
     a = a + 10;
end
disp(a);
exit;
=> Elapsed (wall clock) time (h:mm:ss or m:ss): 0:08.39


With best regards,

Michael





More information about the Python-list mailing list