Do deep inheritance trees degrade efficiency?

A

Anthra Norell

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 ())))).

Frederic
 
P

Peter Otten

Anthra said:
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.

$ 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

Peter
 
P

Peter Otten

Peter said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top