Decorators not worth the effort

88888 Dihedral dihedral88888 at googlemail.com
Fri Sep 14 12:37:37 EDT 2012


Chris Angelico於 2012年9月14日星期五UTC+8下午10時41分06秒寫道:
> On Sat, Sep 15, 2012 at 12:12 AM, andrea crotti
> 
> <andrea.crotti.0 at gmail.com> wrote:
> 
> > def fib(n):
> 
> >     if n <= 1:
> 
> >         return 1
> 
> >     return fib(n-1) + fib(n-2)
> 
> >
> 
> > @memoize
> 
> > def fib_memoized(n):
> 
> >     if n <= 1:
> 
> >         return 1
> 
> >     return fib_memoized(n-1) + fib_memoized(n-2)
> 
> >
> 
> >
> 
> > The second fibonacci looks exactly the same but while the first is
> 
> > very slow and would generate a stack overflow the second doesn't..
> 
> 
> 
> Trouble is, you're starting with a pretty poor algorithm. It's easy to
> 
> improve on what's poor. Memoization can still help, but I would start
> 
> with a better algorithm, such as:
> 
> 
> 
> def fib(n):
> 
> 	if n<=1: return 1
> 
> 	a,b=1,1
> 
> 	for i in range(1,n,2):
> 
> 		a+=b
> 
> 		b+=a
> 
> 	return b if n%2 else a
> 
> 
> 
> def fib(n,cache=[1,1]):
> 
> 	if n<=1: return 1
> 
> 	while len(cache)<=n:
> 
> 		cache.append(cache[-1] + cache[-2])
> 
> 	return cache[n]
> 
> 
> 
> Personally, I don't mind (ab)using default arguments for caching, but
> 
> you could do the same sort of thing with a decorator if you prefer. I
> 
> think the non-decorated non-recursive version is clear and efficient
> 
> though.
> 
> 
> 
> ChrisA

Uhn, the decorator part is good for wrapping functions in python.

For example a decorator can be used  to add a layor of some
message handlings of  those  plain functions
to become iterators which could be used as call back functions
in a more elegant way.






More information about the Python-list mailing list