[Python-Dev] Non-string keys in namespace dicts
Jim Jewett
jimjjewett at gmail.com
Tue Dec 4 20:17:53 CET 2007
PJE wrote:
> Isn't the simplest way to cache attribute
> lookups to just have a cache dictionary in the type,
> and update that dictionary whenever a change is
> made to a superclass? That's essentially how
> __slotted__ attribute changes on base classes
> work now, isn't it?
Neil Toronto wrote:
> The nice thing about caching pointers to dict
> entries is that they don't change as often as
> values do.
Is this really true for namespaces?
I was thinking that the typical namespace usage is a bunch of inserts
(possibly with lookups mixed in), followed by never changing it again
until it is deallocated.
> There are fewer ways to invalidate an
> entry pointer: inserting set, resize, clear, and delete.
I'm not sure how to resize without an inserting set.
I'm not sure I've ever seen clear on a namespace. (I have seen it on
regular dicts being used as a namespace, such as tcl config options.)
I have seen deletes (deleting a temp name) and non-inserting sets ...
but they're both rare enough that letting them force the slow path
might be a good trade, if the optimization is otherwise simpler.
> Rare updating also means it's okay to invalidate the
> entire cache rather than single entries
Changing __bases__ seems to do that already.
(See http://svn.python.org/view/python/trunk/Objects/typeobject.c?rev=59106&view=markup
functions like update_subclasses.)
So I think an alternate version PJE's question would be:
Why not just extend that existing mechanism to work on non-slot,
non-method attributes?
-jJ
More information about the Python-Dev
mailing list