to pass self or not to pass self
Joaquin Abian
gatoygata2 at gmail.com
Wed Mar 17 18:34:53 EDT 2010
On Mar 17, 3:43 pm, Patrick Maupin <pmau... at gmail.com> wrote:
> On Mar 17, 4:12 am, Bruno Desthuilliers <bruno.
>
> 42.desthuilli... at websiteburo.invalid> wrote:
> > Patrick Maupin a écrit :
>
> > > On Mar 16, 1:59 pm, Jason Tackaberry <t... at urandom.ca> wrote:
> > >> Why not create the bound methods at instantiation time, rather than
> > >> using the descriptor protocol which has the overhead of creating a new
> > >> bound method each time the method attribute is accessed?
>
> > > Well, for one thing, Python classes are open. They can be added to at
> > > any time. For another thing, you might not ever use most of the
> > > methods of an instance, so it would be a huge waste to create those.
>
> > A possible optimization would be a simple memoization on first access.
>
> I do agree that memoization on access is a good pattern, and I use it
> frequently. I don't know if I would want the interpreter
> automagically doing that for everything, though -- it would require
> some thought to figure out what the overhead cost is for the things
> that are only used once.
>
> Usually, I will have a slight naming difference for the things I want
> memoized, to get the memoization code to run. For example, if you add
> an underbar in front of everything you want memoized:
>
> class foo(object):
>
> def _bar(self):
> pass
>
> def __getattr__(self, aname):
> if aname.startswith('_'):
> raise AttributeError
> value = getattr(self, '_' + aname)
> self.aname = value
> return value
>
> obj = foo()
>
> So then the first time you look up obj.bar, it builds the bound
> method, and on subsequent accesses it just returns the previously
> bound method.
>
> Regards,
> Pat
Patrick, I was trying to understand the way your code was working but
I thing I'm not getting it.
I tested:
from time import time
class foo1(object):
def _bar(self):
pass
def __getattr__(self, name):
value = getattr(self, '_' + name)
self.name = value
return value
class foo2(object):
def bar(self):
pass
def a(klass, count):
ins = klass()
for i in xrange(count):
z = ins.bar()
t0 = time()
a(foo1, 10000000)
t1 = time()
a(foo2, 10000000)
t2 = time()
print t1-t0 #75 sec
print t2-t1 #11 sec
foo1 is a lot slower than foo2. I understood that memoization should
optimize atribute calls. Maybe I am putting my foot in my mouth...
Thanks
JA
More information about the Python-list
mailing list