繁体   English   中英

python备忘录和内存泄漏

[英]python memoization and memory leaks

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

我从这篇文章改编了一些代码,下面的代码起作用了。 基本上, 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 dict( https://github.com/amitdev/lru-dict )或使用时间限制的缓存对象。 这里有很棒的例子https://pythonhosted.org/cachetools/和这里限制python字典的大小

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM