python 使用Python装饰器进行Memoize

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 使用Python装饰器进行Memoize相关的知识,希望对你有一定的参考价值。

# -*- coding: utf-8 -*-
from functools import wraps


def memoize(obj):
    """
    From Python Decorator Library
    """
    cache = obj.cache = {}

    @wraps(obj)
    def memoizer(*args, **kwargs):
        key = str(args) + str(kwargs)
        if key not in cache:
            cache[key] = obj(*args, **kwargs)
        return cache[key]
    return memoizer


def memoize_method(obj):
    """
    memoize class method adding a property to the class instance
    """
    @wraps(obj)
    def memoizer(*args, **kwargs):
        instance = args[0]
        cache_method = '_{}_cache'.format(obj.__name__)
        key = args[1:] + tuple(sorted(kwargs.items()))

        if not hasattr(instance, cache_method):
            setattr(instance, cache_method, {})
        _cache = getattr(instance, cache_method)

        if key not in _cache:
            _cache[key] = obj(*args, **kwargs)
        return _cache[key]

    return memoizer

以上是关于python 使用Python装饰器进行Memoize的主要内容,如果未能解决你的问题,请参考以下文章

python装饰器的使用

python 通过在Python中使用装饰器进行尾递归优化

python 通过在Python中使用装饰器进行尾递归优化

python 通过在Python中使用装饰器进行尾递归优化

python 通过在Python中使用装饰器进行尾递归优化

python 通过在Python中使用装饰器进行尾递归优化