Subversion Repositories SmartDukaan

Rev

Rev 3098 | Blame | Compare with Previous | Last modification | View Log | RSS feed

'''
Created on 30-Aug-2011

@author: rajveer
'''

import time
class memoized(object):
    '''
    Simple caching for function returns. 
    Any function return can be memoized for a given time duration.
    Time to live also need to be mentioned. It is represented as number of seconds
    '''

    def __init__(self, ttl):
        self.cache = {}
        self.ttl = ttl
        
    def __call__(self, func):
        def wrapped_function(*args):
            try:
                now = time.time()
                value, last_update = self.cache[args]
                if now - last_update > self.ttl:
                    print "EXPIRED"
                    raise AttributeError
                print "HIT"
            except KeyError:
                print "MISS"
                value = func(*args)
                self.cache[args] = value, now
            except AttributeError:
                value = func(*args)
                self.cache[args] = value, now
            except TypeError:
                print "MISS"
                return func(*args)
            return value
        return wrapped_function
        
    def __repr__(self):
        return self.func.__doc__

'''
Example usage
'''
    
@memoized(0)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-2) + fibonacci(n-1)
    
def main():
    print fibonacci(10)
    print fibonacci(12)
if __name__ == '__main__':
    main()