簡體   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