首页 > 编程问答 >Python 缓存工具统计并使用自定义密钥

Python 缓存工具统计并使用自定义密钥

时间:2024-07-30 10:50:48浏览次数:8  
标签:python caching

我正在寻找一种方法来使用 python 的 cachetools 内置缓存库功能,但也支持命中/未命中统计,使用自定义键函数,并且如果可能的话支持无界缓存?

不幸的是,我可以只能找到这些方法:

  1. 如果我想使用未绑定的缓存,并有命中/未命中统计:
    from cachetools.func import lru_cache
    
    @lru_cache(maxsize=None)
    def foo(a, b, c=None):
        print("foo")
    
  2. 如果我想使用未绑定的缓存,并使用自定义键函数:
    from cachetools import cached
    
    @cached(
        cache={},
        key=lambda a, b, c=None: "a" if c is None else "b"
    )
    def foo(a, b, c=None):
        print("foo")
    
    或者,使用这个“hack”:
    from cachetools import cached, LRUCache
    
    @cached(
        cache=LRUCache(maxsize=1, getsizeof=lambda _: 0), # will always pass the test of maxsize check
        key=lambda a, b, c=None: "a" if c is None else "b"
    )
    def foo(a, b, c=None):
        print("foo")
    

如果我想使用命中/未命中统计和自定义按键功能,我该怎么做?
我知道如何自己实现一个,我只是想知道是否有一些已经构建的- 在Python的cachetools/functools中支持这个的方式吗?


cachetools 库本身没有提供一种直接的方法来同时拥有命中/未命中统计信息、自定义键函数和无界缓存。但是,你可以通过组合 cachetools 中提供的不同组件并添加少量代码来实现这一点。

以下是如何实现这一点的方法:

from cachetools import Cache, cached

class StatsCache(Cache):
    def __init__(self, maxsize=None, getsizeof=None):
        super().__init__(maxsize, getsizeof)
        self.hits = 0
        self.misses = 0

    def __getitem__(self, key):
        try:
            value = super().__getitem__(key)
            self.hits += 1
            return value
        except KeyError:
            self.misses += 1
            raise

    def get_stats(self):
        return self.hits, self.misses

@cached(cache=StatsCache(maxsize=None), key=lambda a, b, c=None: "a" if c is None else "b")
def foo(a, b, c=None):
    print("foo")

foo(1, 2)
foo(1, 2)
foo(1, 2, 3)
foo(1, 2, 3)

hits, misses = foo.__wrapped__.__cache__.get_stats()
print(f"Hits: {hits}, Misses: {misses}")

在这个代码中:

  1. 我们创建了一个名为 StatsCache 的自定义缓存类,该类继承自 cachetools.Cache
  2. StatsCache 中,我们初始化了 hits misses 计数器,并在 __getitem__ 方法中更新它们,以跟踪缓存命中和未命中。
  3. get_stats 方法返回命中和未命中计数。
  4. 我们使用 cached 装饰器来装饰我们的函数,将我们的 StatsCache 实例和自定义 key 函数传递给它。
  5. 我们将 maxsize 设置为 None 以获得无界缓存。

通过这种方式,你可以拥有一个具有命中/未命中统计信息、自定义键函数和无界缓存的缓存解决方案。

请记住,由于我们使用的是无界缓存,因此如果缓存的数据量很大,则可能会导致内存使用量过高。

标签:python,caching
From: 63437599

相关文章

  • 如何用Python从PDF文件中抓取数据
    我想抓取此PDF第7页中的数据,然后移至数据框,然后移至CSV。您能提供同样的帮助吗?当然,我可以帮。以下是用Python从PDF文件中抓取数据并将数据保存到CSV文件的步骤:1.安装必要的库需要安装以下Python库:PyPDF2:用于读取P......
  • python读取大型二进制文件最有效的方法是什么
    我有一个大(21GB)文件,我想将其读入内存,然后传递给一个子例程,该子例程对我透明地处理数据。我在Centos6.5上使用python2.6.6,因此无法升级操作系统或python。目前,我正在使用f=open(image_filename,"rb")image_file_contents=f.read()f.close()transparent_subrout......
  • Python:为列表中的每个类对象创建一个不同的副本
    如何制作Python类中对象列表的副本,以便每个副本都是所述Python类的不同实例?假设我有一个Python类classmyClass():def__init__(self,neighbor):self.neighbor=neighbor另外假设myList=[a,b,c,d,...]是一个列表myClass对......
  • 需要使用Python代码将一个文件的一部分复制到另一个文件的相同但空的部分
    例如:需要将文件A中第1部分的x、y和z行复制到文件B中括号之间的第1部分。需要帮助,如果给定多个文件,文件A部分1中的行数将是更改,因此总是需要在括号之间复制到括号之间。文件A:Section1{xyz}Section2{abc}文件B:Section1{}S......
  • Open3D点云裁剪-用Python实现高效的点云处理技术
    点云数据是计算机视觉领域中常用的一种数据表示形式,它以三维空间中的离散点集合的方式来描述物体的形状和结构,在点云数据处理过程中,点云裁剪是一项关键任务,它可以帮助我们从原始的点云数据中提取出感兴趣的物体或区域,从而提高数据处理效率和准确性,本文将介绍如何使用Open3D库和......
  • Python,计算HSV图像的直方图,忽略背景
    我正在尝试使用openCV计算HSV图像的直方图,使用以下代码:defistogrammaHSV(image,histSize):hsv_planes=cv2.split(image)histSize=histSizehistRange=(0,256)accumulate=Falseh_hist=np.array(cv2.calcHist(hsv_planes,[0],None,[......
  • python性能分析器:cProfile
    代码:(1)importcProfileimportrecProfile.run('re.compile("foo|bar")')运行结果:(2)importcProfiledefrunRe():importrecProfile.runctx('re.compile("foo|bar")',None,locals())runRe()运行结果:(3)i......
  • 基于Python网络招聘数据可视化分析系统的设计与实现
    基于Python网络招聘数据可视化分析系统的设计与实现DesignandImplementationofPython-basedNetworkRecruitmentDataVisualizationAnalysisSystem完整下载链接:基于Python网络招聘数据可视化分析系统的设计与实现文章目录基于Python网络招聘数据可视化分析系......
  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......