【Python】python 中 的 memoize 和 memoized

python 中编写递归函数时,为减少计算时间,需要用到 memoize 或 memoized 功能。

它们的作用是:记忆函数每次运行的结果,当递归函数每次递归时,若已经计算过子函数,就直接从记忆中的结果获取,避免重复计算。

在使用这个功能时,一般在程序前面加个 memoized 的类(这个类可以直接复制别人写好的代码)就行,然后在定义递归函数时前面加上 @memoized

例如斐波那契函数,没有使用 memoized 功能的计算时间为 41 秒,使用后计算时间为 0秒。点击此处看原文斐波那契数列的代码

memoized 类的代码(decorator.py):

import collections
import functools


class memoized(object):
    """Decorator. Caches a function's return value each time it is called.
    If called later with the same arguments, the cached value is returned
    (not reevaluated).
    """
    def __init__(self, func):
        self.func = func
        self.cache = {}
        
    def __call__(self, *args):
        if not isinstance(args, collections.Hashable):
            # uncacheable. a list, for instance.
            # better to not cache than blow up.
            return self.func(*args)
        if args in self.cache:
            return self.cache[args]
        else:
            value = self.func(*args)
            self.cache[args] = value
            return value
        
    def __repr__(self):
        """Return the function's docstring."""
        return self.func.__doc__
    
    def __get__(self, obj, objtype):
        """Support instance methods."""
        return functools.partial(self.__call__, obj)

使用:

#coding: utf-8
from decorators import memoized
def myclass(object):
    @memoized
    def __init__(a,b):
        return a+b

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值