Python 如何手动编写一个自己的LRU缓存装饰器的方法实现

想要手动编写一个自己的LRU缓存装饰器,需要遵循以下几个步骤:

  1. 导入functools和collections模块

在Python中,functools模块用于操作函数,collections模块用于提供容器类型,如有序字典(OrderedDict)等。

import functools
import collections
  1. 定义装饰器函数

通过定义一个包装器函数,在函数执行前先检查是否已经存在缓存数据。若存在,则直接返回缓存的值,否则执行函数,并将其返回值加入缓存。

def lru_cache(max_size):
    """LRU缓存装饰器"""
    def decorator(func):
        cache = collections.OrderedDict()  # 设置有序字典缓存

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            key = args + tuple(kwargs.items())  # 将参数和关键字参数组成元组作为缓存的键
            if key in cache:
                # 如果键已经存在,则将它移到有序字典的末尾,并将缓存值返回
                value = cache.pop(key)
                cache[key] = value
            else:
                # 如果键不存在,则执行函数,将返回值存入缓存
                value = func(*args, **kwargs)
                cache[key] = value

                # 如果缓存的键值对数量超过了max_size,则从有序字典的头部开始删除键值对,直到数量小于等于max_size
                if len(cache) > max_size:
                    cache.popitem(last=False)
            return value

        return wrapper

    return decorator

该装饰器函数可以接受一个最大缓存数量的参数,以及一个待装饰的函数。定义缓存时使用了有序字典,它可以按照键值对的插入顺序维护字典中元素的顺序。在wrapper函数中,先将函数的参数和关键字参数组成元组作为缓存的键,先根据键值查找是否存在缓存数据。如果缓存数据已经存在,则先将该键对应的值移动到有序字典的最后,以便于维护其访问顺序;如果缓存数据不存在,则需要执行函数,并缓存返回值,则将键值对添加到有序字典中,并根据最大缓存数量的设定,决定是否要删除最早的缓存数据。

  1. 使用装饰器

使用装饰器,在函数调用的时候可以自动地完成缓存的功能。

示例1:对于输入的参数,进行累加操作,去重后返回

@lru_cache(max_size=2)
def calculate(a,b,c):
    return sum(set([a,b,c]))

print(calculate(1, 2, 3))  # 计算并缓存,返回6
print(calculate(1, 2, 3))  # 直接从缓存中返回6
print(calculate(2, 3, 4))  # 计算并缓存,因为缓存达到最大数量,删除最早的缓存
print(calculate(1, 2, 3))  # 由于之前的计算结果已经被缓存,因此可以直接从缓存中返回6

示例2:对于输入的参数,将输入项中各单词翻转后再返回

@lru_cache(max_size=4)
def reverse_words(s):
    return ' '.join([word[::-1] for word in s.split()])

print(reverse_words('Hello World'))  # 计算并缓存,返回"olleH dlroW"
print(reverse_words('Hello Nice to Meet You'))  # 计算并缓存,返回"olleH eciN ot teeM uoY"
print(reverse_words('Hello World'))  # 直接从缓存中返回之前的结果"olleH dlroW"
print(reverse_words('Nice to Meet You Friend'))  # 计算并缓存,由于缓存已经满了,删除最早的缓存,返回"eciN ot teeM uoY dneirF"
print(reverse_words('Nice to Meet You'))  # 计算并缓存,由于缓存已经满了,删除最早的缓存,返回"eciN ot teeM uoY"
print(reverse_words('Hello Nice to Meet You'))  # 直接从缓存中返回之前的结果"olleH eciN ot teeM uoY"

在上述示例中,对于输入的不同参数,进行缓存,当达到缓存上限时,最早的缓存会被删除,并不断向有序字典的末尾插入新的缓存数据。从而实现了LRU缓存的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 如何手动编写一个自己的LRU缓存装饰器的方法实现 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python面向对象编程(二)

    下面是详细讲解“Python面向对象编程(二)”的完整攻略: 一、面向对象中的继承 继承是面向对象编程中的重要概念,其本质是在已有的类的基础上进行扩展和修改,这样能够大大减少代码的冗余和重复编写,提高程序的可维护性。 1.1 类的定义与创建 在Python中,我们可以通过以下方式定义并创建一个类: class Animal: def __init__(sel…

    python 2023年5月13日
    00
  • Python基础学习函数+模块+类

    Python基础学习——函数、模块和类 在Python中,函数、模块和类都是非常重要的基础知识。 函数 函数是一块可重用的代码,它接受输入并返回输出。函数的优点是可以提高代码的可读性和重复利用性。 函数的定义和调用 在Python中,定义函数的语法为: def function_name(parameter1, parameter2, …): # fun…

    python 2023年6月5日
    00
  • 使用Numpy对特征中的异常值进行替换及条件替换方式

    使用 Numpy 库对特征中的异常值进行替换及条件替换方式的操作在数据处理中非常常见。下面是一些基本的攻略: 对特征中的异常值进行替换 假设我们有一个包含 100 个元素的 Numpy 数组,并且其中有一些异常值。您可以使用Numpy的函数 np.where 来找出数组中所有的异常值,并将其替换为我们想要的值。下面是一个示例代码: import numpy …

    python 2023年5月13日
    00
  • Python任务自动化工具tox使用教程

    Python任务自动化工具tox使用教程 什么是tox tox是一个用于自动化测试、构建、打包Python项目的工具,它和pytest、nose、unittest等测试框架结合使用,可以更加方便的进行项目开发、测试和部署。tox使用tox.ini文件来进行配置,在tox.ini文件中可以定义需要测试的Python版本、依赖关系、测试命令等内容。 安装tox …

    python 2023年6月6日
    00
  • jupyter notebook参数化运行python方式

    下面是详细讲解“jupyter notebook参数化运行python方式”的完整攻略。 什么是Jupyter Notebook? Jupyter Notebook是一种基于Web的交互式计算环境,用于创建Jupyter notebooks文档,这些文档以.ipynb格式保存,可以包含代码、文本、数学符号、可视化等内容。Jupyter Notebook支持多…

    python 2023年6月3日
    00
  • python 数据库查询返回list或tuple实例

    以下是“Python数据库查询返回list或tuple实例”的完整攻略。 1. 查询返回list或tuple实例 在Python中,使用数据库查询时,查询结果可以返回list或tuple实例。其中,list例一个可变序列,而tuple实例是一个不可变序列。查询结果返回的是一个包含多个元素的序列,每个元素对应一条查询结果。 2. 返回list实例 使用Pyth…

    python 2023年5月13日
    00
  • python用pip install时安装失败的一系列问题及解决方法

    Python用pip install时安装失败的一系列问题及解决方法 在Python编程中,我们经常会使用pip install命令来安装第三方库或模块。但是,有时候我们会遇到pip install安装失败的问题。本文将详细讲解Python用pip install时安装失败的一系列问题及解决方法,包括问题的原因、解决方法和两个示例。 问题原因 在Python…

    python 2023年5月13日
    00
  • python Crypto模块的安装与使用方法

    让我来分享一下Python Crypto模块的安装与使用方法的完整攻略。 安装Python Crypto模块 Python Crypto模块是一个第三方库,它提供了常见的加密算法和协议,比如AES、RSA、DES等。在使用前需要先进行安装。 步骤一:检查Python版本 在安装Python Crypto模块前,需要确认本机已安装Python,并且要求版本不低…

    python 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部