Python Forum

Full Version: caching attribute reference
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3
@Ofnuts, given the advice at https://wiki.python.org/moin/PythonSpeed...iding_dots... and my inability to find anything saying that CPython does any kind of optimization, I'm really doubtful of that. PyPy very well could.
(Feb-23-2017, 03:53 PM)micseydel Wrote: [ -> ]@Ofnuts, given the advice at https://wiki.python.org/moin/PythonSpeed...iding_dots... and my inability to find anything saying that CPython does any kind of optimization, I'm really doubtful of that. PyPy very well could.

OK, so some experimental evidence that you are right:
import timeit,random

class Counter(object):
    def __init__(self):
        self.someattribute=0
    
    def runAttrib1(self,runs):
        self.someattribute=0
        x=random.randint(1,10)
        for _ in range(runs):
            self.someattribute+=x
        return self.someattribute
            
    def runAttrib2(self,runs):
        self.someattribute=0
        x=random.randint(1,10)
        for _ in range(runs):
            self.someattribute=self.someattribute+x
        return self.someattribute
            
    def runLocal(self,runs):
        self.someattribute=0
        attribcopy=self.someattribute
        x=random.randint(1,10)
        for _ in range(runs):
            attribcopy+=x
        self.someattribute=attribcopy
        return x

counter=Counter()
number=1000
print ("%12s: %12.8f" % ('Attrib1',timeit.timeit(stmt='counter.runAttrib1(100000)',setup='from __main__ import counter', number=number)))
print ("%12s: %12.8f" % ('Attrib2',timeit.timeit(stmt='counter.runAttrib2(100000)',setup='from __main__ import counter', number=number)))
print ("%12s: %12.8f" % ('Local',  timeit.timeit(stmt='counter.runLocal(100000)',  setup='from __main__ import counter', number=number)))
Output for Python2:
Output:
     Attrib1:  10.37185884      Attrib2:   8.38905406        Local:   5.44241190
Output for Python3:
Output:
     Attrib1:   9.38220573      Attrib2:   8.99003031        Local:   4.89760979
So yes, some optimizations aren't done. Strangely var+=x (Attrib1) is slower than var=var+x (Attrib2)...
it's nice to know
just what is slow
that we may code
without much load
Pages: 1 2 3