微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

记忆处理程序

如何解决记忆处理程序

您可以进行记忆,而不必诉诸eval

(非常基本的)备注:

def memoized(f):
    cache={}
    def ret(*args):
        if args in cache:
            return cache[args]
        else:
            answer=f(*args)
            cache[args]=answer
            return answer
    return ret

@memoized
def fibonacci(n):
    if n==0 or n==1:
        return 1
    else:
        return fibonacci(n-1)+fibonacci(n-2)

print fibonacci(100)

解决方法

创建像下面这样的类可以为您处理备注过程的“良好实践”吗?
记忆的好处是如此之大(在某些情况下,像这样,在我的计算机上,它从501003下降到1507函数调用,从1.409下降到0.006秒CPU时间),看来这样的类很有用。

但是,我只阅读了有关的否定评论eval()考虑到这种方法提供的灵活性,这种用法是否可以原谅?

这样可以自动保存任何返回值,但会损失副作用。谢谢。

import cProfile

class Memoizer(object):
    """A handler for saving function results."""
    def __init__(self):
        self.memos = dict()
    def memo(self,string):
        if string in self.memos:
            return self.memos[string]
        else:
            self.memos[string] = eval(string)
            self.memo(string)

def factorial(n):
    assert type(n) == int
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

# find the factorial of num
num = 500
# this many times
times = 1000

def factorialTwice():
    factorial(num)
    for x in xrange(0,times):
        factorial(num)
    return factorial(num)

def memoizedFactorial():
    handler = Memoizer()
    for x in xrange(0,times):
        handler.memo("factorial(%d)" % num)
    return handler.memo("factorial(%d)" % num)


cProfile.run('factorialTwice()')

cProfile.run('memoizedFactorial()')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。