python 记忆和内存泄漏

python memoization and memory leaks

我的目标是记住对象实例化,这样只有一个对象具有相同的初始化参数。

我从 this post 中改编了一些代码,下面的代码有效。基本上,memoize 是一个缓存初始化参数的装饰器。下次使用相同的初始化参数时,将返回缓存的对象,而不是创建一个新对象。

from functools import wraps                                                        

def memoize(function):                                                             
    memo = {}                                                                      

    @wraps(function)                                                               
    def wrapper(*args):                                                            
        if args in memo:                                                           
            return memo[args]                                                      
        else:                                                                      
            rv = function(*args)                                                   
            memo[args] = rv                                                        
            return rv                                                              
    return wrapper                                                                 


@memoize                                                                           
class Test(object):                                                                
    def __init__(self, v):                                                         
        self.v = v                                                                 

class TT(object):                                                                  
    def __init__(self, v):                                                         
        self.t = Test(v)                                                           

tests= [Test(1), Test(2), Test(3), Test(2), Test(4)]                               

for test in tests:                                                                 
    print test.v, id(test)                                                         

tt = TT(2)                                                                         
print id(tt.t) 

我得到了想要的结果

1 4355094288
2 4355094416
3 4355094544
2 4355094416
4 4355094672
4355094416

我的问题是我需要手动清除缓存memoize.memo吗?似乎它将包含引用并防止释放内存。有没有办法让这个资源发布更加自动化?

您可以使用 lru/mru 字典 (https://github.com/amitdev/lru-dict) or use a time limited cache object. There are great examples here https://pythonhosted.org/cachetools/ and here Limiting the size of a python dictionary