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。
我的目标是记住对象实例化,这样只有一个对象具有相同的初始化参数。
我从 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。