10分钟掌握Python缓存,效率提升1000%

news2024/10/7 5:55:18

全文速览

  • python的不同缓存组件的使用场景和使用样例
  • cachetools的使用

项目背景

代码检查项目,需要存储每一步检查的中间结果,最终把结果汇总并写入文件中

在中间结果的存储中

  • 可以使用context进行上下文的传递,但是整体对代码改动比较大,违背了开闭原则
  • 也可以利用缓存存储,处理完成之后再统一读缓存并写入文件

在权衡了不同方案后,我决定采用缓存来存储中间结果。接下来,我将探讨 Python 中可用缓存组件。

python缓存分类

决定选择缓存,那么python中都有哪些类型的缓存呢?

1. 使用内存缓存(如 functools.lru_cache

这是最简单的一种缓存方法,适用于小规模的数据缓存。使用 functools.lru_cache 可以对函数结果进行缓存。

from functools import lru_cache

@lru_cache(maxsize=128)
def expensive_function(param1, param2):
    # 进行一些耗时的操作
    return result

2. 使用本地文件缓存(如 diskcache

如果缓存的数据较大,或者需要跨进程共享缓存,可以使用文件系统缓存库,例如 diskcache

import diskcache as dc

cache = dc.Cache('/tmp/mycache')

@cache.memoize(expire=3600)
def expensive_function(param1, param2):
    # 进行一些耗时的操作
    return result

3. 使用分布式缓存(如 Redis)

对于需要跨多个应用实例共享缓存的数据,可以使用 Redis 这样的分布式缓存系统。

import redis
import pickle

r = redis.StrictRedis(host='localhost', port=6379, db=0)

def expensive_function(param1, param2):
    key = f"{param1}_{param2}"
    cached_result = r.get(key)
    if cached_result:
        return pickle.loads(cached_result)
    
    result = # 进行一些耗时的操作
    r.set(key, pickle.dumps(result), ex=3600)  # 设置缓存过期时间为1小时
    return result

总结

如果只是简单的小规模缓存,lru_cache 足够;如果需要持久化或分布式缓存,可以考虑使用 diskcache 或 Redis;如果使用了 Web 框架,使用框架自带的缓存功能会更方便。

python内存缓存分类

兼顾速度和成本以及实现的复杂度,最终决定使用内存缓存,在 Python 中,内存缓存组件有许多选择,每种都有其特定的优点和适用场景。以下是一些常见的内存缓存组件:

1. functools.lru_cache

lru_cache 是 Python 标准库中的一个装饰器,用于缓存函数的返回结果,基于最近最少使用(LRU)策略。

from functools import lru_cache

@lru_cache(maxsize=128)
def expensive_function(param1, param2):
    # 进行一些耗时的操作
    return result

2. cachetools

cachetools 是一个第三方库,提供了多种缓存策略,包括 LRU、LFU、TTL(基于时间的缓存)等。

from cachetools import LRUCache, cached

cache = LRUCache(maxsize=100)

@cached(cache)
def expensive_function(param1, param2):
    # 进行一些耗时的操作
    return result

3. django.core.cache

如果使用 Django 框架,Django 自带了缓存框架,支持多种缓存后端,包括内存缓存。

settings.py 中配置内存缓存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

4. Flask-Caching

如果使用 Flask 框架,Flask-Caching 插件可以方便地实现内存缓存。

from flask import Flask
from flask_caching import Cache

app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

@app.route('/expensive')
@cache.cached(timeout=60)
def expensive_function():
    # 进行一些耗时的操作
    return result

5. requests_cache

requests_cache 是一个专门用于缓存 HTTP 请求的库,支持多种缓存后端,包括内存缓存。

import requests
import requests_cache

requests_cache.install_cache('demo_cache', backend='memory', expire_after=3600)

response = requests.get('https://api.example.com/data')

6. dogpile.cache

dogpile.cache 是一个更高级的缓存库,提供了灵活的缓存后端和缓存失效策略。

from dogpile.cache import make_region

region = make_region().configure(
    'dogpile.cache.memory',
    expiration_time=3600
)

@region.cache_on_arguments()
def expensive_function(param1, param2):
    # 进行一些耗时的操作
    return result

7. joblib.Memory

joblib.Memory 常用于科学计算和数据处理领域,用于缓存函数的计算结果。

from joblib import Memory

memory = Memory(location='/tmp/joblib_cache', verbose=0)

@memory.cache
def expensive_function(param1, param2):
    # 进行一些耗时的操作
    return result

总结

根据具体需求和使用场景选择合适的内存缓存组件。对于简单的缓存需求,可以使用 functools.lru_cachecachetools。对于 Web 应用,django.core.cacheFlask-Caching 是不错的选择。对于 HTTP 请求缓存,可以使用 requests_cache。对于科学计算,joblib.Memory 是一个好选择。

cachetools使用

我的项目是一个命令行执行的项目,综合考量最终决定选择cachetools

  1. 安装 cachetools
pip install cachetools
  1. 实现缓存工具类
from cachetools import LRUCache
from cachetools import Cache
from siada.cr.logger.logger import logger


class CacheUtils:
    """
    缓存工具类
    """

    def __init__(self, cache: Cache = None):
        self.cache = cache if cache else LRUCache(maxsize=100)

    def get_value(self, cache_key: str):
        value = self.cache.get(cache_key, None)
        if value is not None:
            logger.info(f"Cache hit for key: {cache_key}")
        else:
            logger.info(f"Cache miss for key: {cache_key}")
        return value

    def set_key_value(self, cache_key: str, value):
        self.cache[cache_key] = value
        logger.info(f"Set cache key: {cache_key} with value: {value}")

    def set_key_list(self, cache_key: str, value):
        v = self.cache.get(cache_key, None)
        if v is not None:
            v.append(value)
        else:
            self.cache[cache_key] = [value]

    def clear_cache(self):
        self.cache.clear()


# TODO 如果后续生成过程改为多线程并发,需考虑数据竞争问题
cache = CacheUtils()

更多惊喜

我还将定期分享:

  • 最新互联网资讯:让你时刻掌握行业动态。

  • AI前沿新闻:紧跟技术潮流,不断提升自我。

  • 技术分享与职业发展:助你在职业生涯中走得更远、更稳。

  • 程序员生活趣事:让你在忙碌的工作之余找到共鸣与乐趣。

关注回复【1024】惊喜等你来拿!

点击查看惊喜

敬请关注【程序员世杰】

点击关注程序员世杰

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jira实践案例分享:小米集团如何通过API请求优化、数据治理与AI智能客服等,实现Jira系统的高效运维

日前,Atlassian中国合作伙伴企业日活动在上海成功举办。活动以“AI协同 创未来——如何利用人工智能提升团队协作,加速产品交付”为主题,深入探讨了AI技术在团队协作与产品交付中的创新应用与实践,吸引了众多业内专家、企业客户及…

股掌柜:实时行情数据和工具:揭示投资潜力的关键

如今充斥着各种投资信息、交易平台和金融工具的时代,如何抓住投资机会成为了每个投资者必须面对的重要挑战。一个明确的投资策略和准确的市场分析成为了判断市场走势和抓住投资机会的关键。而实时行情数据和工具的使用则能够为投资者提供全面、准确的市场信息&#…

选择诊所管理系统的原则是什么?

如今,诊所管理系统已成为医疗机构提升管理效率、优化患者服务的重要工具。然而,市场上的诊所管理系统琳琅满目,功能各异,因此,如何选择一款适合自己诊所的管理系统,是许多诊所管理者需要思考的问题。下面&a…

idea常用配置 | 快捷注释

idea快速注释 一、类上快速注释 (本方法是IDEA环境自带的,设置特别方便简单易使用) 1、偏好设置->编辑器->文件和代码模版 | File-Settings-Editor-File and Code Templates 2、右下方的“描述”中有相对应的自动注注释配置格式 贴…

什么是期货基金?

期货基金,是指广大投资者将资金集中起来,委托给专业的期货投资机构,并通过商品交易顾问进行期货投资交易,投资者承担投资风险并享有投资利润的一种集合投资方式。期货基金的投资对象主要有两大类商品:期货与金融期货。…

使用nvm命令进行node和npm版本下载以及切换

下载以及安装nvm方式 https://blog.csdn.net/ppz8823/article/details/130862191 1.查看nvm版本 nvm -v2.查看node 和 npm版本 node -v npm -v3.使用nvm查看已下载的node版本 nvm ls4.使用nvm 查看可使用的在线node版本 nvm list available4.下载想要使用的node版本&#x…

叉车装载机智能AI影像防撞系统,让车辆远离事故!

"员工受伤会给你的公司带来多少损失? 如果把安全放在首位,你会节省多少钱? 避免碰撞和降低工作场所的伤害风险,不仅可以挽救生命,还可以降低整体成本。" 你知道吗?2021年度全国叉车事故总数为42起…

互联网医院系统开发中的移动端应用设计

在现代医疗服务中,互联网医院系统逐渐成为提升患者体验和优化医疗资源的重要手段。而移动端应用作为互联网医院系统的关键组成部分,其设计和开发尤为重要。本文将从设计原则、技术架构和具体实现等方面探讨互联网医院系统中的移动端应用设计,…

Android studio Logcat 功能介绍

介绍 Android Studio Jellyfish版本下logcat功能,不同的tag会有不同的颜色,不同level等级的log默认也有不同的颜色。log过滤修改的更简洁了,原先的log视图只需要勾选就可以选择不同level的log了,当前需要在输入框中进行过滤器匹配…

高性能并行计算华为云实验三:蒙特卡罗算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建蒙特卡罗算法源码 3.2 Makefile的创建与编译 3.3 主机文件配置与运行监测​​​​​​​ 四、实验结果与分析 4.1 原教程对应的实验结果 4.2 改进后的实验结果 五、实验思考与总结 5.1 实验思考 5.2 实验总结…

高效安全的IPXProxy代理服务:摆脱免费代理的烦恼

​在现代互联网环境中,IP代理的使用变得越来越普遍。无论是企业级用户还是个人用户,都需要借助IP代理来实现隐私保护、网络加速和跨区域访问。然而,面对市场上众多的代理服务,有些用户会因为成本考虑而选择免费代理。然而&#xf…

用python做地图绘制

1.写代码 from pyecharts.charts import Map from pyecharts.options import VisualMapOptsmapMap() data[("上海市",122),("北京市",12),("天津市", 12),("广东省",22) ] map.add("测试地图",data) map.set_global_opts(v…

惠海 H6901B升压恒流3.7V 7.4V 12V 24V 30V 36V 48V 60V 80V 100V LED灯杯方案

H6901B是一款升压型LED恒流驱动芯片,具有良好稳定性的特点。H6901B的主要特点包括宽输入电压范围(2.7V-100V)、高工作频率(1MHz)以及多种保护功能(如芯片供电欠压保护、过温保护、软启动等)。此…

专业,城市,院校,高考填报志愿的三要素怎么排序?

我认为排序方式可以参考: 城市>学校 同样是计算机专业,不论学校的高低,一线城市更容易接触到时代的前端,有更多学习机会,有更好的文化氛围,同样在就业的时候也更容易接触到企业.... 如果要把专业考虑进…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 二(51-)

环境:OpenCV3.2.0 VS2015 51、Mean-Shift算法分割图像 cv::pyrMeanShiftFiltering() 参考链接:【从零学习OpenCV 4】分割图像——Mean-Shift分割算法 Mean-Shift算法又被称为均值漂移法,是一种基于颜色空间分布(彩色图像的像素值)的图像分割…

C语言实战 | “贪吃蛇”游戏重构

程序设计的过程中,面对复杂项目,利用模块化思维分解任务,是关键的一步。读者一定要掌握模块化思维设计思维,为将来团队合作、协同完成大型应用软件做好准备。 01、“贪吃蛇”游戏 有了游戏框架之后,按照游戏框架完成“贪吃蛇”游戏。 “贪吃蛇”游戏角色有两个:“贪吃蛇…

高考填报志愿,为什么要做性格测试?

我认为兴趣跟报志愿是有很大关系的。兴趣可以让你学习的动力更强,可以让你在困难面前更加坚强。根据兴趣爱好来选择的专业,可以让你更容易获得职业满足感,成就感,就酱。 有些人说兴趣变成了职业,就没有兴趣了&#xf…

10.二次开发——黑马程序员Java最新AI+若依框架项目

目录 前言零、使用若依修改器修改项目名称一、创建sky-merchant模块1.创建模块2. 在新模块中导入依赖3. 父工程锁定版本4. sky-admin 导入依赖 二、菜品管理页面生成1.根据页面原型,确定表信息2.设计表3使用代码生成器生成页面4,下载tb_dish代码并分别导…

【AI编译器】triton学习:编程模型

介绍 动机 在过去十年里,深度神经网络 (DNNs) 已成为机器学习 (ML) 模型的一个重要分支,能够实现跨领域多种应用中的最佳性能。这些模型由一系列包括参数化(如滤波器)和非参数化(如缩小值函数)元件组成的…

arco.design 利用 a-input-search 和 a-trigger 自己实现一个关键字查询select

先看效果 <div class"search-content" id"map-search-wrapper"><a-triggerpopup-visibleposition"bl"autoFitPopupWidth:popup-offset"4":unmount-on-close"true"trigger"click"popup-container"#m…