2017-05-18 5 views
0

私の目標は、同じ初期化引数を持つオブジェクトが1つしかないように、オブジェクトインスタンス化をメモすることです。python memoizationとメモリリーク

私は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をクリアする必要がないということですか?それは参照を含み、メモリが解放されないようにするようです。このリソースのリリースをより自動化する方法はありますか?

答えて

関連する問題