查找lru_cache装饰器的内存使用情况

问题描述 投票:0回答:1

我想跟踪 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
输出)

python caching python-lru-cache
1个回答
0
投票

黑客:在垃圾收集跟踪中找到具有正确元素数量的所有字典,记住它们的字节大小,然后清除缓存并打印变空的管道的大小:

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
© www.soinside.com 2019 - 2024. All rights reserved.