Re: SVN: zope.interface/branches/jinty-mem/src/zope/interface/interface.py Improve CPU performance of previous memory optimization

Laurence Rowe <[email protected]>
Newsgroups gmane.comp.web.zope.devel
Message-ID <[email protected]>
On 9 November 2010 18:35, Tres Seaver <[email protected]> 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  -  [email protected]
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 )
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.