Hello there.
I've just noticed what I consider a performance problem:
Using new style classes to provide attribute-like access using __getattr__ is 
considerably slower than old style classes:  Observe:

s = """
class dude:
        def bar(self):pass
        def __getattr__(self, a): return a
class dude2(object):
        def bar(self):pass
        def __getattr__(self, a): return a
d = dude()
d2 = dude2()
d.a = d2.a = 1
"""
timeit.Timer(´d.foo´, s).timeit()
>0.32979211801421116
timeit.Timer(´d2.foo´, s).timeit()
> 1.1119853719342245

The overhead is almost 3 times as high.  I imagine that this is because new 
style classes must search further and harder before giving up and going to 
__getattr__.
For the bound method the difference is less:

timeit.Timer(´d.bar´, s).timeit()
> 0.11835480370018558
timeit.Timer(´d2.bar´, s).timeit()
> 0.17820851929263881

For fun, I also tested regular attributes, and see:

timeit.Timer(´d.a´, s).timeit()
> 0.069161394202183146
timeit.Timer(´d2.a´, s).timeit()
> 0.17966275972594303

I'm surprised that accessing instance attributes like this is twice as slow 
using new style classes.

Any thoughts on this?
We are using a lot of low-level attribute access magic in EVE and so it would 
appear that we are best served by sticking with old-style classes.  But these 
are going away eventually, so what to do?
Where is this extra overhead coming from?
And oh, it is no use using __getattribute__ instead, since it will always 
involve calls to object.__getattribute__ and become very slow.

Cheers,
Kristján


_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to