can multi-core improve single funciton?

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Tue Feb 10 02:34:54 EST 2009


On Tue, 10 Feb 2009 14:28:15 +0800, oyster wrote:

> I mean this
> [code]
> def fib(n):
>     if n<=1:
>         return 1
>     return fib(n-1)+fib(n-2)
> 
> useCore(1)
> timeit(fib(500)) #this show 20 seconds
> 
> useCore(2)
> timeit(fib(500)) #this show 10 seconds [/code]
> 
> Is it possible?

What does useCore(n) mean?


> and more, can threads/multi-processors/clusters be used to improve fib?

No. The best way to improve fib is to improve fib, not to try running it 
on faster hardware.

Your algorithm makes *many* recursive calls to fib() for each call:

fib(1) => 1 function call
fib(2) => 3 function calls
fib(3) => 5 function calls
fib(4) => 9 function calls
fib(5) => 15 function calls
fib(6) => 25 function calls
fib(7) => 41 function calls
fib(8) => 67 function calls
fib(9) => 109 function calls
...
fib(34) => 18454929 function calls
fib(35) => 29860703 function calls
fib(36) => 48315633 function calls
...
fib(498) => 1.723e+104 function calls
fib(499) => 2.788e+104 function calls
fib(500) => 4.511e+104 function calls

Calling fib(500) the way you do will make more than 450 thousand billion 
billion billion billion billion billion billion billion billion billion 
billion function calls. You claim that you calculated it in just 20 
seconds. On my PC, it takes over a minute to calculate fib(38). I 
estimate it would take over five hours to calculate fib(50), and fib(100) 
would probably take 16 million years. I call shenanigans.



-- 
Steven



More information about the Python-list mailing list