首页 > 其他分享 >建立函数及其参数的结果缓存

建立函数及其参数的结果缓存

时间:2024-11-19 15:30:42浏览次数:1  
标签:__ 缓存 obj 函数 self cache 参数 def

from functools import wraps
import time

class CacheManager:
    def __init__(self):
        self._cache = {}

    def get_cache_obj(self, key):
        """获取缓存对象"""
        return self._cache.get(key)

    def add_cache_obj(self, key, obj):
        """添加缓存对象"""
        self._cache[key] = obj
        return obj

    def __del__(self):
        """清除所有缓存对象"""
        # print(f"CacheManager del")
        for k, v in self._cache.items():
            # print(f"CacheManager del:{k=}")
            del v
        self._cache.clear()
        del self._cache

    @classmethod
    def cache_result(cls, func):
        """
        装饰器:缓存结果,支持参数作为缓存的唯一键。
        """

        @wraps(func)
        def wrapper(instance, *args, **kwargs):
            # 根据函数名和参数构建唯一缓存键
            key = f"{func.__name__}:{args}:{kwargs}"
            print(key)

            # 检查是否已缓存
            cache_obj = instance.cache_manager.get_cache_obj(key)
            if cache_obj is not None:
                print(cache_obj)
                return cache_obj

            # 缓存中没有对象,执行函数并缓存结果
            result = func(instance, *args, **kwargs)
            instance.cache_manager.add_cache_obj(key, result)
            print(result)
            return result

        return wrapper

class MyClass:
    def __init__(self):
        self.cache_manager = CacheManager()

    def __del__(self):
        print("MyClass.__del__")

    @property
    @CacheManager.cache_result
    def oms_user(self):
        # 该代码只在缓存不存在时执行
        # return [1, 2, 3]
        return time.time()


def test_cache():
    m = MyClass()
    print(id(m.oms_user))
    print(id(m.oms_user))

test_cache()

结果

oms_user:():{}
1732000987.240014
2584475181488
oms_user:():{}
1732000987.240014
2584475181488
MyClass.__del__

Python cache 内存泄漏问题

创建于2411191534,修改于2411191534

标签:__,缓存,obj,函数,self,cache,参数,def
From: https://www.cnblogs.com/tellw/p/18554960

相关文章

  • QObject Event( )customEvent( ) 函数区别
    事件处理流程中的角色event函数event函数是QObject中事件处理的总入口。当有任何事件传递到一个QObject或者它的派生类对象时,这个函数首先被调用。它就像是一个事件调度中心,负责接收各种各样的事件,并根据事件的类型把它们分发给对应的具体处理函数。例如,对于......
  • 单变量微积分学习笔记:函数奇偶性(14)
    常见奇函数:\[\frac{a^x\pm1}{a^x\mp1}\]\[log\frac{a\pmx}{a\mpx}\]\[log(\sqrt{x^2+1}\pmx)\]\[f(x)-f(-x)=奇\]\[\sum_{i=1}^{n}奇=奇\]\[\prod_{i=1}^{2k+1}奇=奇\]常见偶函数:\[f(x)+f(-x)=偶\]\[\sum_{i=1}^{n}偶=偶\]\[\prod_{i=1}^{n}偶=......
  • 快捷方式工具类 - C#小函数类推荐
          此文记录的是快捷方式操作类。/***快捷方式工具类AustinLiu刘恒辉ProjectManagerandSoftwareDesignerE-Mail:[email protected]:http://lzhdim.cnblogs.comDate:2024-01-1515:18:00使用参考:ShortC......
  • C++中的友元函数和友元类&友元的作用及注意事项
    1.C++中的友元函数和友元类友元函数:友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常,同一个开发者会出于技术和非技术的原因控制类的友元和成员函数,否则在更新类时,还需要征得其他部分的拥有者的同意。友元函数在定义上和调用......
  • 【算法】KMP 与 Z 函数
    1.KMP1.1算法简介可以做到线性匹配的快速匹配字符串的算法,并可以维护字符串最长公共前后缀,扩展出计算字符串周期。在OI界KMP算法是字符串板块中很经典的算法,可以扩展出很多巧妙的解题技巧。1.2算法流程1.2.1字符串匹配考虑\(O(n^2)\)暴力的匹配,瓶颈在于每次匹配了......
  • new 函数(一)name 参数
    在UVM(UniversalVerificationMethodology)中,new函数是构造对象的关键函数之一,它用于创建和初始化UVM对象或组件。UVM中的new函数不仅用于创建对象,还通常涉及到对象的初始化和设置属性(如名字)。new函数的使用方式有一定的规范,特别是在UVM的对象和组件体系中。1.new......
  • new 函数 (二) parent 参数
    在UVM(UniversalVerificationMethodology)中,new函数通常用于创建对象或组件,并进行初始化。对于大多数uvm_object和uvm_component类,new函数会使用stringname参数来指定对象的名称。parent参数主要与uvm_component类有关,用于指定组件的父级组件。这个参数对于UVM......
  • 记录个Java/Groovy的小问题:空字符串调用split函数返回非空数组
    问题复现最近写了一个groovy替换程序增量流水线脚本(会Java也能看懂),示意脚本如下://获取文件列表方法deflistFiles(folder){defoutput=sh(script:"ls${folder}",returnStdout:true).trim()returnoutput.split('\n')asList}//调用以上方法获取lib目录下......
  • 单变量微积分学习笔记:反函数求导法则(12)【6,9,11】
    常用公式\(\arcsin(x)=\frac{1}{\sqrt{1-x^2}}\)\(\arccos(x)=-\frac{1}{\sqrt{1-x^2}}\)\(\arctan(x)=\frac{1}{1+x^2}\)证明\(y=\arcsin(x)\)\(\sin(y)=x\)\(\cos(y)y'=1\)\(y'=\frac{1}{\cos(y)}\)\(y'=\......
  • R语言caretEnsemble包的caretList函数一次性构建多个机器学习模型、caret包的resample
    R语言caretEnsemble包的caretList函数一次性构建多个机器学习模型、caret包的resamples函数比较在同一数据集上多个机器学习模型的比较结果目录R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、并使用caret包的resamples函数比较在同一数据集上多个机......