| Jeremy Hylton : weblog : 2003-05-06 |
Tuesday, May 06, 2003
I tried out the new timeit module today. How long does it take to access an attribute on a class instance? I tried three variations: a classic class, a new-style class, and a new-style class with slots.
The class had 16 attributes named "a1" .. "a8" and "b1" .. "b8". The timeit test statement was just "obj.b1". The three results are:
| Regular new-style class | 0.24 |
| New-style class w/slots | 0.18 |
| Classic class | 0.16 |
Measurement: 200,000 iterations on my laptop.
Conclusion: Attribute lookup on a new-style class is 50% slower than on a classic class. The use of slots speeds up lookup and gets closer to the classic class speed.
What if we add inheritance to the mix? I created subclasses of the original classes. The classic and new-style class had no body (just a pass). The slot-style class said __slots__ = "a1", just because it needed to declare that it used slots. Then I repeated the same steps, so I could test with one base class and two.
| 1BC | 2BC | |
|---|---|---|
| Regular new-style class | 0.26 | 0.29 |
| New-style class w/slots | 0.25 | 0.31 |
| Classic class | 0.16 | 0.16 |
The new-style class is a little slower, but the slot-style class is a lot slower. The slot-style class is now slower than the new-style class without slots. The classic class stayed the same. It looks like slot-style classes continue to get worse as the inheritance hierarchy gets deeper. The exact behavior depends on how many base classes must be traversed before the slot descriptor is found.