[Tutor] Tutor Digest, Vol 53, Issue 99

kinuthiA muchanE muchanek at gmail.com
Tue Jul 29 08:31:52 CEST 2008


On Tue, 2008-07-29 at 01:12 +0200, tutor-request at python.org wrote:
> Message: 3
> Date: Mon, 28 Jul 2008 13:26:13 -0500
> From: "Daniel Sarmiento" <dsarmientos at gmail.com>
> Subject: Re: [Tutor] Memory error - how to manage large data sets?
> To: tutor at python.org
> Message-ID:
>         <d356a5240807281126t6bd27dc5y6ef411305a9f5f5a at mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
> 
> Hi
> 
> I tried to run your code and checked (with top) the memory ussage and
> it uses more than 2 Gb of memory.
> 
> I tried to modify the code a little bit to use less memory and came up
> with this:
> 
> fib = {0:0,1:1}
> even = []
> 
> def fibonacci(x,y):
>    return x+y
> 
> for j in xrange (2,1000000):
>     i = fib[j-1] + fib[j-2]
>     if i % 2 == 0:
>         even.append(i)
>     fib = {j-1:fib[j-1], j:i}
> 
> total = reduce(fibonacci,even)
> print total
> 
> First, I replaced range with xrange.
> I figured that you only need the last two values in the fibonnaci
> series to calculate the next value, so I replaced the fib list with a
> dictionary to only store the last two values instead of the whole
> series.
> 
> It looks like the progam still hangs and I did not notice any memory
> imrovements when running it with 1 000 000
> 
> Am I wrong thinking that the modifications I made help use less
> memory?
> 
I have realised that when you need to work with large numbers, lists are
slow and tend to gobble up bytes. Another thing try to be as simple as
possible :). This is how I would approach the problem, without using
lists. It produces the result instantly, even for large numbers like a
100, 000, 000.

def fibonacci()
    a = 0
    b = 1
    evenTotal = 0
    while a < 100000000:
        a,b = b,a+b
        if a%2 == 0:
    	    evenTotal += a
    print evenTotal

Does this help?
Kinuthia...



More information about the Tutor mailing list