On 9 November 2010 18:35, Tres Seaver <tsea...@palladion.com> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 11/09/2010 08:26 AM, Wichert Akkerman wrote: >> On 11/9/10 14:22 , Brian Sutherland wrote: >>> Log message for revision 118295: >>> Improve CPU performance of previous memory optimization >>> >>> Changed: >>> U zope.interface/branches/jinty-mem/src/zope/interface/interface.py >>> >>> -=- >>> Modified: zope.interface/branches/jinty-mem/src/zope/interface/interface.py >>> =================================================================== >>> --- zope.interface/branches/jinty-mem/src/zope/interface/interface.py >>> 2010-11-09 08:31:37 UTC (rev 118294) >>> +++ zope.interface/branches/jinty-mem/src/zope/interface/interface.py >>> 2010-11-09 13:22:27 UTC (rev 118295) >>> @@ -51,6 +51,7 @@ >>> # infrastructure in place. >>> # >>> #implements(IElement) >>> + __tagged_values = None >>> >>> def __init__(self, __name__, __doc__=''): >>> """Create an 'attribute' description >>> @@ -72,22 +73,27 @@ >>> >>> def getTaggedValue(self, tag): >>> """ Returns the value associated with 'tag'. """ >>> - return getattr(self, '_Element__tagged_values', {})[tag] >>> + if self.__tagged_values is None: >>> + return default >>> + return self.__tagged_values[tag] >> >> You can even optimise this further: >> >> tv = self.__tagged_values >> if tv is None: >> return default >> return tv[tv] >> >> that avoids a second attribute lookup. You may also want to benchmark >> that versus using a __tagged_values={} on the class and doing a simple >> return self.__tagged_values.get(tag, default_ > > - -1: mutable class defaults are a bug magnet.
None is immutable so I don't think that is a problem in this case. I think the is a possible threading issue with Element.setTaggedValue and Specification.subscribe - if two threads called the method concurrently, then one of the values might be lost. I think the correct way to do it would be: tv = self.__tagged_values if tv is None: tv = self.__dict__.setdefault('_Element__tagged_values', {}) tv[tag] = value This does bring the name mangling back though. Laurence _______________________________________________ Zope-Dev maillist - Zope-Dev@zope.org https://mail.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - https://mail.zope.org/mailman/listinfo/zope-announce https://mail.zope.org/mailman/listinfo/zope )