Profiling weirdness: Timer.timeit(), fibonacci and memoization
ssecorp
circularfunc at gmail.com
Sat Aug 2 09:02:02 EDT 2008
I am not clear about the results here.
from timeit import Timer
import Decorators
def fib(n):
a, b = 1, 0
while n:
a, b, n = b, a+b, n-1
return b
@Decorators.memoize
def fibmem(nbr):
if nbr > 1:
return fibmem(nbr-1) + fibmem(nbr-2)
if nbr == 1:
return 1
if nbr == 0:
return 0
s = 100
t1 = Timer('fib(s)', 'from __main__ import fib, s')
t2 = Timer('fibmem(s)', 'from __main__ import fibmem, s')
t1.repeat(number=1)
t2.repeat(number=1)
print t1.timeit()
print t2.timeit()
>>>
35.3092010297
1.6516613145
>>>
So memoization is 20+ times faster than the idiomatic way?
Or am I missing something here?
Ok for fun I added memoization to the idiomatic one:
from timeit import Timer
import Decorators
@Decorators.memoize
def fib(n):
a, b = 1, 0
while n:
a, b, n = b, a+b, n-1
return b
@Decorators.memoize
def fibmem(nbr):
if nbr > 1:
return fibmem(nbr-1) + fibmem(nbr-2)
if nbr == 1:
return 1
if nbr == 0:
return 0
s = 100
t1 = Timer('fib(s)', 'from __main__ import fib, s')
t2 = Timer('fibmem(s)', 'from __main__ import fibmem, s')
t1.repeat(number=1)
t2.repeat(number=1)
print t1.timeit()
print t2.timeit()
didn't think it would make a difference there but it certainly did.
>>>
1.59592657726
1.60179436213
>>> ================================ RESTART ================================
>>>
2.66468922726
3.0870236301
>>> ================================ RESTART ================================
>>>
1.62921684181
1.51585159566
>>> ================================ RESTART ================================
>>>
1.49457319296
1.60948472501
>>> ================================ RESTART ================================
>>>
1.48718203012
1.6645559701
>>>
More information about the Python-list
mailing list