"Karthik" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED]
Forgot to include the following information,
Platform - win32
Version - 2.5.1
Error message:
Traceback (most recent call last):
 File "C:\Python25\programs\fibo.py", line 10, in <module>
   if i % 2 == 0:
MemoryError

OK, It does look like you bust your memory allocation.

Code:



fib = []
even = []

You don't really need two lists.

def fibonacci(x,y):
   return x+y

And this isn't really the fibonacci function its an addition
which you don;t need(see below)

for i in range (0,1000000):

This creates a 3rd list of 1 million numbers, so thats
3 million * the storage of one number. Still not enough
to trouble most PCs nowadays...

   if i < 2:
       fib.append(i)
   else:
       i = fib[i-1] + fib[i-2]
       if i % 2 == 0:
           fib.append(i)

You want to append to fib on every number not just on evens?
So just take this outside the if.

           even.append(i)

You don't need this because we can extract the even numbers
when we do the summation later. All its doing it gobbling up space.

       else:
           fib.append(i)

dispense with the else and just put the fib append outside.
ie your code becomes

for i in xrange (0,1000000):  # xranmge should avoid the extra list
   if i >= 2:
       i = fib[i-1] + fib[i-2]
   fib.append(i)

total = reduce(fibonacci,even)

You could use the sum() function in Python 2.5 but for
your purpose I'd propose using the fib list and using slicing
to select every second element:

L = range(10)
L[::2]
[0, 2, 4, 6, 8]


So you could use

total = sum(fib[::2])

and dispense with evens entirely

Any pointers would be of great help to me.

Frankly I'm puzzled why its using so much RAM.
I'd expect resource usage to be around 20-30MB
tops. hmmm, OK a bit of experimentation shows
that the fibonacci series generates very big numbers
very quickly so each entry is a long number - a very
long number!

21000 characters for the 100,000th entry!

No wonder it blows up.

You have two choices - use floats, which might still
not be big enough! ... It isn't,  98500 out of 100000 entries
were infinite using floats! So you need to calculate the
total as you go without saving the values

Or buy a much, much bigger computer! :-)

PS I did all of that investigation using the >>> prompt.
Its a very useful tool for trying things out, I just generated
the list (using 100,000 entries) and examined the contents
using various list comprehensions and len() etc

HTH,

--
Alan Gauld
Author of the Learn to Program web site
http://www.freenetpages.co.uk/hp/alan.gauld

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to