[Python-Dev] PATCH: attribute lookup caching for 2.6
Neil Toronto
ntoronto at cs.byu.edu
Thu Dec 6 07:35:10 CET 2007
Phillip J. Eby wrote:
> At 07:43 PM 12/5/2007 -0700, Neil Toronto wrote:
>> 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.
Good grief - how did I miss that? I plead parenthesis. They threw me off.
So I've applied Armin's patch to 2.6 (it was nearly clean) and am
playing with it. cls.name lookups are 15-20% faster than mine, and
inst.name lookups are 5-10% faster. His is also winning on hasattr calls
(succeeding and failing) on classes, but mine is winning on hasattr
calls on instances. I want to poke at it a bit to find out why.
On pybench, his is faster at BuiltinMethodLookups, significantly faster
at CreateNewInstances, and a bit faster at almost everything else.
BuiltinFunctionCalls is slower - slower than stock - it might need
poking there, too.
In all, it's a lovely piece of work.
Neil
More information about the Python-Dev
mailing list