Hello

I wrote a decorator to add a cache to functions.
I realized that cache dictionnary could be defined
as an object attribute or as a local variable in
method __call__.
Both seems to work properly.
Can you see any differences between the two variants ?

from collection import OrderedDict

class Memoize1:
    def __init__(self, size=None):
        self.size = size
        self.cache = OrderedDict()     ### cache defined as an attribute
    def __call__(self, f):
        def f2(*arg):
            if arg not in self.cache:
                self.cache[arg] = f(*arg)
                if self.size is not None and len(self.cache) >self.size:
                    self.cache.popitem(last=False)
            return self.cache[arg]
        return f2

# variant

class Memoize2:
    def __init__(self, size=None):
        self.size = size
    def __call__(self, f):
        cache = OrderedDict()      ### cache defined as a local variable
        def f2(*arg):
            if arg not in cache:
                cache[arg] = f(*arg)
                if self.size is not None and len(cache) > self.size:
                    cache.popitem(last=False)
            return cache[arg]
        return f2

@Memoize1(16)
def fibo1(n):
    if n < 2: return n
    return fibo1(n-2)+fibo1(n-1)


@Memoize2(16)
def fibo2(n):
    if n < 2: return n
    return fibo2(n-2)+fibo2(n-1)
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to