我发现了一个记忆代码片段,我想知道它在复制。复制

2024-10-03 19:21:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我找到了一个不错的记忆装饰:

http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

特定的应用程序在人工智能中,它将位于一个不可变的状态类中。问题是我通过返回一个复制。复制应用了请求的运算符。这个复制。复制节省了大量原本会浪费的时间,因为大多数状态与其父状态相同。在

现在,这是我的问题。如果我在类中使用上面的记忆化类,那么函数的记忆副本是否会被传递给潜在的无效值?我想我需要以某种方式使回忆录本失效。在


Tags: 记忆org应用程序http状态wiki浪费运算符
2条回答

是的。copy.copy是浅层的,所以它只是复制对memoizing包装器对象的引用。如果删除memoized__get__方法,可以这样尝试(否则,您将得到一个用于支持绑定方法的partial对象):

class C(object):
    @memoized
    def foo(): pass

o1 = C()
o2 = copy.copy(o1)
print o1.foo.cache is o2.foo.cache

您可以在需要时(即复制时)构造一个新的包装器:memoized(C.foo.func)。在

通常,复制一个对象应该创建一个精确的克隆:如果它有缓存的值,也应该复制它们。如果不这样做,这通常是对深度复制的速度优化,不会有明显的副作用。在

如果您正在制作某个内容的副本,并且希望清除该副本中的缓存值,则应显式清除该缓存。在

如果您确实希望对象的副本不复制缓存,那么定义__copy__或{}方法来控制复制。(请注意,这通常用于复制底层资源,如文件描述符和句柄)。在

这里有两个例子。在

class memoized(object):
    """
    Decorator that caches a function's return value each time it is called.
    If called later with the same arguments, the cached value is returned, and
    not re-evaluated.
    """
    def __init__(self, func):
        self.func = func
        self.cache = {}
    def __copy__(self):
        """
        Don't copy the cache in a copy.
        """
        return memoized(self.func)
    def __deepcopy__(self, memo):
        """
        Don't copy the cache in a deep copy.
        """
        return memoized(self.func)

    def __call__(self, *args):
       try:
           return self.cache[args]
       except KeyError:
           value = self.func(*args)
           self.cache[args] = value
           return value
       except TypeError:
           # uncachable   for instance, passing a list as an argument.
           # Better to not cache than to blow up entirely.
           return self.func(*args)
    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)
    def clear_cache(self):
        self.cache = {}

@memoized
def fibonacci(n):
    "Return the nth fibonacci number."
    if n in (0, 1):
        return n
    return fibonacci(n-1) + fibonacci(n-2)

fibonacci(12)
print fibonacci.cache
fibonacci.clear_cache()
print fibonacci.cache

fibonacci(12)
print fibonacci.cache
import copy
f = copy.deepcopy(fibonacci)
print f.cache

相关问题 更多 >