Do deep inheritance trees degrade efficiency?

Peter Otten __peter__ at web.de
Thu Mar 19 11:09:05 CET 2009


Peter Otten wrote:

> Anthra Norell wrote:
> 
>> Would anyone who knows the inner workings volunteer to clarify whether
>> or not every additional derivation of a class hierarchy adds an
>> indirection to the base class's method calls and attribute read-writes.
>> In C++, I suppose, a three-level inheritance would resolve into
>> something like *(*(*(*(base_class_method ())))).
> 
> I think in C++ the compiler can often resolve the correct class
> statically. Python currently walks through the entire hierarchy.

"currently" meaning 2.5 here...
 
> $ cat inherit.py
> class A(object):
>     def m(self):
>         return 42
> 
> 
> B = A
> for i in range(1000):
>     class B(B): pass
> 
> a = A()
> b = B()
> 
> if __name__ == "__main__":
>     print a.m()
>     print b.m()
> 
> $ python -m timeit -s"from inherit import a" "a.m"
> 10000000 loops, best of 3: 0.173 usec per loop
> $ python -m timeit -s"from inherit import b" "b.m"
> 10000 loops, best of 3: 68.7 usec per loop

[Christian Heimes]
> Your assumption is no longer true. Starting with Python 2.6 and 3.0 the
> lookup of attributes is cached. You can find detailed information by
> searching for VERSION_TAG in the source code.

I missed that change. Here are the 2.6 timings:

$ python2.6 -m timeit -s"from inherit import a" "a.m"
10000000 loops, best of 3: 0.171 usec per loop
$ python2.6 -m timeit -s"from inherit import b" "b.m"
10000000 loops, best of 3: 0.169 usec per loop

Impressing.

Peter



More information about the Python-list mailing list