[Python-Dev] PATCH: attribute lookup caching for 2.6
Phillip J. Eby
pje at telecommunity.com
Thu Dec 6 06:08:09 CET 2007
At 07:43 PM 12/5/2007 -0700, Neil Toronto wrote:
>Phillip J. Eby wrote:
> > At 10:48 PM 12/5/2007 +0100, Georg Brandl wrote:
> >> Neil Toronto schrieb:
> >>> So Jim and PJE finally convinced me to do it the right way. :) Thanks
> >>> guys - it turned out very nice.
> >> How does this relate to Armin Rigo's method cache patch?
> >> (http://bugs.python.org/issue1685986)
> > Interesting. Armin's approach uses a single global cache of up to
> > 1024 descriptors. That seems a lot simpler than anything I thought
> > of, and might perform better by encouraging the processor to keep the
> > descriptors in cache. It has a lot less pointer indirection, and has
> > a dirt-simple way of invalidating a class' entries when something changes.
>Hey, I took out all my extra pointer indirection. :p
>FWIW, I like it. Though the hash should really incorporate the hash of
>the type name as well as the attribute's so that sometype.method calling
>othertype.method doesn't invalidate the cache. Locality makes the global
>cache work, but locality also often means re-using the same names.
Look at the patch more closely. The hash function uses a version
number times the method name's hash. "Version" numbers are assigned
one per class, so unless there are 2**32 classes in the system, they
are uniquely numbered. The multiplication and use of the high bits
should tend to spread the hash locations around and avoid same-name collisions.
Of course, it's still always possible to have pathological cases, but
even these shouldn't be much slower than the way things work now.
More information about the Python-Dev