Do deep inheritance trees degrade efficiency?
__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
> 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
More information about the Python-list