[BangPypers] python speed comparison

Anand Balachandran Pillai abpillai at gmail.com
Fri Aug 6 04:01:26 CEST 2010


On Fri, Aug 6, 2010 at 3:00 AM, Dhananjay Nene <dhananjay.nene at gmail.com>wrote:

> On Fri, Jul 23, 2010 at 1:26 PM, Emil Chacko <emilchacko at gmail.com> wrote:
>
> > Below given is solution to a puzzle(
> > http://projecteuler.net/index.php?section=problems&id=14) in python and
> c
> >
> > Python:
> >
> > import time
> > startT=time.time()
> > maxlen=0
> > longest=0
> > for i in xrange(1,1000000):
> >  last=i
> >  cnt=0
> >  while(last <> 1):
> >  cnt=cnt+1
> >  if(last%2==0):
> >   last=last/2
> >  else:
> >   last=3*last+1
> >  if(cnt>maxlen):
> >  maxlen=cnt
> >  longest=i
> > print "time taken (sec) : ",time.time()-startT
> > print maxlen,longest
> >
> > Python Output:
> > time taken (sec) :  99.4702298641
> > 524 837799
> >
> > C:
> >
> > #include <stdio.h>
> > int main(int argc, char **argv)
> > {
> > int longest = 0;
> > int maxlen = 0;
> > int i;
> > unsigned long last;
> > for (i = 1; i <= 1000000; i++)
> > {
> >  last = i;
> >  int cnt = 0;
> >  while (last != 1)
> >  {
> >  cnt++;
> >   if (last % 2 == 0)
> >    last = last / 2;
> >  else
> >    last = 3 * last + 1;
> >  }
> >  if (cnt > maxlen)
> >  {
> >  maxlen = cnt;
> >  longest = i;
> >  }
> > }
> > printf("longest: %d (%d)\n", longest, maxlen);
> > return 0;
> > }
> >
> >
> > My doubt is that in C the result comes in 1-2 sec but in python it takes
> 99
> > secs.I don't expect python to be as fast as c but i cant understand why
> it
> > should be so slow in python.i'm new to python so if there is better way
> to
> > do the above prog in python please suggest.
> >
>
> Your python code as is clocked about 72 seconds on my notebook. The
> following came in at about 4.6 seconds (just has a small trick of reusing
> earlier results)
>
> import time
> start =time.time()
> longest = None
> longest_elements = 0
> solved = {}
> for val in xrange(1,1000000) :
>    counter = 1
>    number = val
>    while number != 1 :
>        number = number / 2 if number % 2 == 0 else 3 * number + 1
>        if number in solved :
>            counter = counter + solved[number]
>            break
>        else :
>            counter = counter + 1
>    if counter > longest_elements :
>        longest_elements = counter
>        longest = val
>    solved[val] = counter
> end = time.time()
> print "Time:", end - start
> print longest, ':', longest_elements
>
> Dhananjay
>


Good approach. I remember solving around 50 or so project
euler problems a while back in Python and I used caching
of previous results in a dictionary for most complex
problems which speeded up the calculation tremendously.

 This technique is often called "memoization".

 In Python, caching/memoizing decorators can often
 be used to solve this problem.


>
> > _______________________________________________
> > BangPypers mailing list
> > BangPypers at python.org
> > http://mail.python.org/mailman/listinfo/bangpypers
> >
>
>
>
> --
> --------------------------------------------------------
> blog: http://blog.dhananjaynene.com
> twitter: http://twitter.com/dnene
> _______________________________________________
> BangPypers mailing list
> BangPypers at python.org
> http://mail.python.org/mailman/listinfo/bangpypers
>



-- 
--Anand


More information about the BangPypers mailing list