python 中编写递归函数时,为减少计算时间,需要用到 memoize 或 memoized 功能。
它们的作用是:记忆函数每次运行的结果,当递归函数每次递归时,若已经计算过子函数,就直接从记忆中的结果获取,避免重复计算。
在使用这个功能时,一般在程序前面加个 memoized 的类(这个类可以直接复制别人写好的代码)就行,然后在定义递归函数时前面加上 @memoized
例如斐波那契函数,没有使用 memoized 功能的计算时间为 41 秒,使用后计算时间为 0秒。copy" rel="nofollow">点击此处看原文斐波那契数列的代码。
memoized 类的代码(decorator.py):
<pre class="has">
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 <a href="https://www.jb51.cc/tag/isinstance/" target="_blank" class="keywords">isinstance</a>(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 <a href="https://www.jb51.cc/tag/get/" target="_blank" class="keywords">__get__</a>(self,obj,objtype):
"""Support instance methods."""
return <a href="https://www.jb51.cc/tag/functools/" target="_blank" class="keywords">functools</a>.partial(self.__call__,obj)</code></pre>
使用:
<pre class="has">
#coding: utf-8
from decorators import memoized
def myclass(object):
@memoized
def init(a,b):
return a+b
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。