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 -- http://mail.python.org/mailman/listinfo/python-list