self modifying code

Robin Becker robin at NOSPAMreportlab.com
Sun Apr 30 05:36:54 EDT 2006


Ben C wrote:
.......
> 
> Why not just:
> 
> data = None
> def func(a):
>     global data
> 
>     if not data:
>         data = somethingcomplexandcostly()
> 
>     return simple(data, a)
> 

well in the original instance the above reduced to something like

data=None
def func(arg):
     global data
     if data:
        data = ......
     return ''.join(map(data.__getitem__,arg))

so the actual function is pretty low cost, but the extra cost of the 
test is actually not very significant, but if the actual function had 
been cheaper eg

def func(arg):
     global data
     if data is None:
        data = ....
     return data+arg

then the test is a few percent of the total cost; why keep it?

All the other more complex solutions involving namespaces, singletons 
etc seem to add even more overhead.

> Or nicer to use a "singleton" perhaps than a global, perhaps something
> like this:
> 
> class Func(object):
>     exists = False
> 
>     def __init__(self):
>         assert not Func.exists
>         Func.exists = True
> 
>         self.data = None
> 
>     def simple(self, a):
>         assert self.data is not None
>         # ... do something with self.data presumably
>         return something
> 
>     def __call__(self, a):
>         if self.data is None:
>             self.data = somethingcomplexandcostly()
>         return self.simple(a)
> 
> func = Func()
> 
> func(a)


-- 
Robin Becker



More information about the Python-list mailing list