[Zope-dev] SVN: zope.interface/branches/jinty-mem/src/zope/interface/interface.py Improve CPU performance of previous memory optimization
Tres Seaver
tseaver at palladion.com
Tue Nov 9 15:01:09 EST 2010
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 11/09/2010 02:47 PM, Laurence Rowe wrote:
> On 9 November 2010 18:35, Tres Seaver <tseaver at 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.
Wiggy's later suggestion was to use '{}' as a class-level default, which
is what my -1 was for.
> 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.
I'm pretty sure we can safely neglect threading issues here: no sane
code will call 'setTaggedValue' except at import time, when we should be
serialized by Python's own import lock.
Tres.
- --
===================================================================
Tres Seaver +1 540-429-0999 tseaver at palladion.com
Palladion Software "Excellence by Design" http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAkzZqIUACgkQ+gerLs4ltQ6nBwCfe7QuTKam33YV7gxsLkO8ere/
OC4AoLEwXHNNRKxdbArD25p9ycMX1QdJ
=4MsJ
-----END PGP SIGNATURE-----
More information about the Zope-Dev
mailing list