Python应用利器:缓存妙用,让你的程序更出色更快速!

更多资料获取

📚 个人网站:ipengtao.com


在 Python 应用程序中,使用缓存能够显著提高性能并降低资源消耗。本文将详细介绍如何在 Python 中实现缓存机制,包括内置 functools 模块提供的 lru_cache 装饰器以及自定义缓存机制。

使用 functools 模块的 lru_cache

functools 模块提供了 lru_cache 装饰器,可以轻松添加缓存到函数中。

from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 调用函数并观察缓存效果
print(fibonacci(20))  # 第一次调用,不命中缓存
print(fibonacci(20))  # 第二次调用,命中缓存

自定义缓存装饰器

自定义一个装饰器实现简单的缓存功能,以适应更多的自定义需求。

def custom_cache(func):
    cache = {}

    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result

    return wrapper

@custom_cache
def custom_fibonacci(n):
    if n <= 1:
        return n
    return custom_fibonacci(n-1) + custom_fibonacci(n-2)

# 测试自定义缓存效果
print(custom_fibonacci(20))  # 第一次调用,不命中缓存
print(custom_fibonacci(20))  # 第二次调用,命中缓存

缓存的应用场景

缓存不仅适用于斐波那契数列等计算密集型任务,还适用于数据库查询、API 调用结果和复杂计算结果的存储。

@lru_cache(maxsize=256)
def query_from_database(query):
    # 模拟数据库查询
    # ...
    return result

# 第一次数据库查询
result1 = query_from_database('SELECT * FROM table')

# 第二次相同查询,命中缓存
result2 = query_from_database('SELECT * FROM table')

缓存的过期和失效处理

添加过期时间或周期性清理缓存是处理缓存数据过期和失效的重要策略。以下是相关的实现方法:

过期时间处理

可以通过为缓存数据设置过期时间,并在数据访问时检查数据是否过期,若过期则从缓存中移除。

from functools import lru_cache
import time

@lru_cache(maxsize=256)
def cached_function(arg):
    # 设置缓存有效时间为60秒
    cache_duration = 60

    # 缓存的时间戳
    if not hasattr(cached_function, "cache_timestamp"):
        cached_function.cache_timestamp = time.time()

    current_time = time.time()
    if current_time - cached_function.cache_timestamp > cache_duration:
        # 清理缓存并重新赋值时间戳
        cached_function.cache_clear()
        cached_function.cache_timestamp = current_time

    return arg  # 此处为缓存的数据,可替换为实际的计算结果

周期性清理缓存

可以定时执行清理缓存的操作,删除过期的缓存数据或根据特定规则清理缓存。

from threading import Timer

@lru_cache(maxsize=256)
def cached_function(arg):
    # ...(函数逻辑)

# 定时清理缓存,每60秒执行一次
def periodic_cache_cleanup():
    cached_function.cache_clear()
    Timer(60, periodic_cache_cleanup).start()

# 开启定时清理任务
Timer(60, periodic_cache_cleanup).start()

注意事项

在处理缓存的过期和清理时,需要考虑并发访问可能带来的问题,确保对缓存数据的操作是线程安全的。另外,适当的清理频率和合理的过期时间是需要仔细权衡的,以避免对性能造成额外的负担。

缓存淘汰策略

在自定义缓存中,你可以根据实际需求选择合适的淘汰策略。除了 LRU (Least Recently Used) 策略外,还有其他常见的淘汰策略:

LFU (Least Frequently Used)

基于使用频率较少的缓存数据进行淘汰,而非 LRU 策略基于最近最少使用。这种策略适用于需要更好地预测未来访问模式的场景。

FIFO (First In, First Out)

按照缓存数据最早进入的顺序进行淘汰,保留最近加入的数据。这种策略较为简单,适用于不需要考虑数据使用频率的场景。

LRU-K

LRU-K 策略结合了 LRU 和 LFU 的思想,基于最近访问次数和最近使用时间进行淘汰。该策略能更好地适应缓存数据的实际访问情况。

实现自定义缓存淘汰策略

from functools import lru_cache
from collections import OrderedDict

# 自定义缓存
class CustomCache:
    def __init__(self, max_size):
        self.max_size = max_size
        self.cache = OrderedDict()

    def __call__(self, func):
        def wrapper(*args):
            if args in self.cache:
                self.cache.move_to_end(args)
                return self.cache[args]
            result = func(*args)
            if len(self.cache) >= self.max_size:
                self.cache.popitem(last=False)
            self.cache[args] = result
            return result
        return wrapper

# 使用自定义缓存并设置淘汰策略
@CustomCache(max_size=128)
def custom_function(arg):
    return arg * arg

以上是一个示例,自定义了一个带有淘汰策略的缓存装饰器。在实际应用中,根据需求设计并实现合适的淘汰策略能够更好地管理缓存数据。

性能优化与注意事项

确保缓存的合理使用是关键,尤其是对于大型数据的缓存。以下是性能优化和注意事项:

1. 内存消耗与缓存大小

确保缓存大小是合理的,特别是在处理大型数据时。如果缓存数据过大,可能会占用过多内存,影响系统性能。

2. 定期清理和过期缓存

定期清理过期的缓存数据,以避免过多无用数据占用内存。实现合理的缓存清理机制,比如设定过期时间或周期性清理操作。

3. 缓存命中率监控

监控缓存命中率以评估缓存效果。高命中率表明缓存有效,低命中率可能表明缓存策略不合适或数据模式发生变化。

4. 缓存并发访问的安全性

确保缓存在并发访问下是安全的。考虑多线程或多进程的情况,避免出现竞态条件和数据不一致性。

5. 冷启动问题

在缓存刚启动或过期之后,由于缓存未命中,可能会引发一段时间的性能下降。考虑采用预热缓存的方法,提前加载常用数据,降低冷启动对性能的影响。

6. 限制缓存数据的生命周期

对于特定数据,限制其缓存生命周期,避免长时间存储对内存的过度消耗。

总结

缓存是优化 Python 应用程序性能的有效手段。functools 模块提供了简单易用的 lru_cache,而自定义缓存装饰器则允许更多的自定义和灵活性。合适地应用缓存能够显著提升程序的性能,但需注意在实际应用中灵活运用,避免不必要的资源浪费。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FacetWP Hierarchy Select网站内容层次结构选择插件

点击阅读FacetWP Hierarchy Select网站内容层次结构选择插件原文 FacetWP Hierarchy Select网站内容层次结构选择插件可让您基于分层分类法创建引导下拉菜单。 FacetWP Hierarchy Select网站内容层次结构选择插件功能 通过引导式下拉菜单过滤结果&#xff0c;一次一个深度级…

用python写一个简单的爬虫

爬虫是一种自动化程序&#xff0c;用于从互联网上获取数据。它能够模拟人类浏览网页的行为&#xff0c;访问网页并提取所需的信息。爬虫在很多领域都有广泛的应用&#xff0c;例如数据采集、信息监控、搜索引擎索引等。 下面是一个使用Python编写的简单爬虫示例&#xff1a; …

2023/11/30JAVAweb学习(postman,各种参数,统一响应数据,三层架构,分层解耦,bean组件扫描,Bean注入及解决方式)

数组json形式 想切换实现类,只需要只在你需要的类上添加 Component 如果在同一层,可以更改扫描范围,但是不推荐这种方法 注入时存在多个同类型bean解决方式

SQL手工注入漏洞测试(PostgreSQL数据库)-墨者

———靶场专栏——— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 靶场背景&#xff1a; 来源&#xff1a; 墨者学院 简介&#xff1a; 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

[SHCTF 2023]——week1-week3 Web方向详细Writeup

Week1 babyRCE 源码如下 <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\>|\<|\|\"/i", $rce)) {system($rce);}else {echo "hhhhhhacker!!!".&…

医院信息化专业人员必备医院业务运作及管理流程知识(详细)

业务流程是一家医院运作的基础,医院所有业务都需要流程加以驱动。熟知医院各项业务,了解医院管理流程,有利于医院工作人员更好地投入自身岗位,提高工作效率。本文整理了常见医院业务运作及管理流程,仅供参考! 【门诊业务】 一、门诊业务的特点: 1.接诊病人多,就诊时…

全网最新最全的自动化测试教程:python+pytest接口自动化-requests发送post请求

简介 在HTTP协议中&#xff0c;与get请求把请求参数直接放在url中不同&#xff0c;post请求的请求数据需通过消息主体(request body)中传递。 且协议中并没有规定post请求的请求数据必须使用什么样的编码方式&#xff0c;所以其请求数据可以有不同的编码方式&#xff0c;服务…

Linux下快速创建大文件的4种方法

1、使用 dd 命令创建大文件 dd 命令用于复制和转换文件&#xff0c;它最常见的用途是创建实时 Linux USB。dd 命令是实际写入硬盘&#xff0c;文件产生的速度取决于硬盘的读写速度&#xff0c;根据文件的大小&#xff0c;该命令将需要一些时间才能完成。 假设我们要创建一个名…

记录华为云服务器(Linux 可视化 宝塔面板)-- Nginx配置出现500错误记录

文章目录 1、路由配置&#xff0c;访问显示500如有启发&#xff0c;可点赞收藏哟~ 1、路由配置&#xff0c;访问显示500 错误如图显示500 解决思路如下 1、先查看错误日志 错误日志存放位置 提示 /login配置的文件有问题 开始配置如下图 修改前 修改后&#xff08;即在/l…

自动化集成有哪些典型应用场景?

为什么要做自动化场景集成&#xff1f; 主要分为以下几点&#xff1a; 提高效率/减少错误&#xff1a;减少人工操作、人为错误、人力成本&#xff0c;提高生产效率、生产质量和稳定性。 提高可靠性&#xff1a;提高系统的可靠性和稳定性&#xff0c;减少系统故障和停机时间。…

【以太网物理层】DM9161A

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大…

自定义 el-select 和 el-input 样式

文章目录 需求分析el-select 样式input 样式 需求 自定义 选择框的下拉框的样式和输入框 分析 el-select 样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更改:deep .el-inp…

12.4c++中的继承

#include <iostream>using namespace std;class Sofa { private:string way;int *score; public:Sofa(){}//有参构造函数Sofa(string way,int score):way(way),score(new int(score)){cout << "Sofa::有参构造函数" << endl;}//拷贝构造函数Sofa(c…

SSM项目实战-POJO设计

1、schedule_db.sql CREATE DATABASE schedule_db CHARACTER SET utf8 ;USE schedule_db;CREATE TABLE sys_schedule (sid int NOT NULL AUTO_INCREMENT COMMENT 日程id,uid int DEFAULT NULL COMMENT 用户id,title varchar(50) DEFAULT NULL COMMENT 标题,completed int DEFAU…

hs_err_pid.log 分析工具 CrashAnalysis

GitHub - xpbob/CrashAnalysis java -jar CrashAnalysis-1.0-SNAPSHOT.jar hs_err_pid1817966.log

前缀和例题:子矩阵的和AcWing796-Java版

//前缀和模板提,在读入数据的时候就可以先算好前缀和的大小 //计算前缀的时候用:g[i][j] g[i][j-1] g[i-1][j] - g[i-1][j-1] Integer.parseInt(init[j-1]); //计算结果的时候用:g[x2][y2] - g[x1 - 1][y2]- g[x2][y1-1] g[x1 -1][y1 - 1] "\n" //一些重复加的地…

Web APIs—介绍、获取DOM对象、操作元素内容、综合案例—年会抽奖案例、操作元素属性、间歇函数、综合案例—轮播图定时器版

版本说明 当前版本号[20231204]。 版本修改说明20231204初版 目录 文章目录 版本说明目录复习变量声明 Web APIs - 第1天笔记介绍概念DOM 树DOM 节点document 获取DOM对象案例— 控制台依次输出3个li的DOM对象 操作元素内容综合案例——年会抽奖案例操作元素属性常用属性修改…

12月4日作业

完成沙发床的多继承 #include <iostream>using namespace std;class Sofa { private:string sit;int *price; public:Sofa() {cout << "Sofa::无参构造函数" << endl;}Sofa(string sit,int price):sit(sit),price((new int(price))){cout <<…

Pillow操控图像,Python必备神器全面解析!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Pillow 是一个强大的 Python 图像处理库&#xff0c;它提供了丰富的功能&#xff0c;能够处理图像的加载、编辑、处理和保存。这个库建立在 Python Imaging Library (PIL) 的基础上&#xff0c;并延续了 PIL 的开…

【网络安全】-《网络安全法》制定背景和核心内容

文章目录 1. 背景介绍1.1 数字时代的崛起1.2 中国网络安全形势 2. 《网络安全法》核心内容2.1 法律适用范围2.2 个人信息保护2.3 关键信息基础设施保护2.4 网络安全监管和应急响应2.5 网络产品和服务安全管理2.6 法律责任和处罚 3. 法律的意义和影响3.1 维护国家安全3.2 保护个…