我想跟踪 lru_cached 类方法的内存使用情况。
我知道如何提取方法调用的数量
from functools import lru_cache
class Exponent:
def __init__ (self, base):
self.base = base
@lru_cache(maxsize=None)
def __call__(self, exponent):
return self.base ** exponent
exponent_base_two = Exponent(2)
exponent_base_two(2);
exponent_base_two(3);
exponent_base_two.__call__.cache_info()
输出:
CacheInfo(hits=2, misses=2, maxsize=None, currsize=2)
但是,我正在寻找一种方法来提取cache大小(以字节为单位)(类似于
sys.getsizeof
输出)
黑客:在垃圾收集跟踪中找到具有正确元素数量的所有字典,记住它们的字节大小,然后清除缓存并打印变空的管道的大小:
from functools import lru_cache
class Exponent:
def __init__ (self, base):
self.base = base
@lru_cache(maxsize=None)
def __call__(self, exponent):
return self.base ** exponent
exponent_base_two = Exponent(2)
exponent_base_two(2);
exponent_base_two(3);
import gc, sys
sizes = [
(obj, sys.getsizeof(obj))
for obj in gc.get_objects()
if type(obj) is dict and len(obj) == exponent_base_two.__call__.cache_info().currsize
]
exponent_base_two.__call__.cache_clear()
for dct, size in sizes:
if not dct:
print(size)
我得到的输出(在线尝试!):
224