首页 > 编程语言 >Python中Cache的使用

Python中Cache的使用

时间:2024-09-25 17:49:50浏览次数:11  
标签:10 缓存 Python Cache value cache computation 使用 print

文章目录

一、缓存的基础概念

缓存(Cache) 是一种在应用程序中提升性能的技术,它通过将一些数据临时存储在快速访问的存储介质(如内存)中,以减少数据的重复计算或重复读取。通常,缓存用于存储一些昂贵计算或IO密集型操作的结果,从而加快程序的执行速度。

在 Python 中,缓存通常用于函数的输出、API 请求的结果、数据库查询、文件读取等场景。Python 提供了多种方式来实现缓存机制,包括内置的工具以及外部库支持。

二、基础使用

  1. functools.lru_cache
    Python 内置的 functools 模块提供了一个非常方便的缓存装饰器 lru_cache(Least Recently Used Cache),它可以将函数的返回结果缓存起来,减少相同输入的重复计算。
    基础示例:
from functools import lru_cache

@lru_cache(maxsize=128)  # maxsize表示缓存的最大容量
def expensive_computation(x):
    print(f"Computing {x}...")
    return x * x

# 第一次调用会执行计算
print(expensive_computation(10))  # Output: Computing 10... 100

# 第二次调用相同的输入时,直接从缓存返回结果,不再计算
print(expensive_computation(10))  # Output: 100

在这个例子中,expensive_computation(10) 被调用两次,但第二次调用时并不会重复计算,而是直接返回缓存的结果。
参数:
maxsize:定义缓存的最大大小。超过此大小后,最近最少使用的条目会被移除。如果设置为 None 则表示缓存无限大小。
typed:如果为 True,会区分不同类型的参数,例如 11.0 被认为是不同的。
查看缓存信息:

print(expensive_computation.cache_info())  # 查看缓存的命中率、缓存大小等信息

清空缓存:

expensive_computation.cache_clear()  # 清除缓存

三、进阶使用

  1. lru_cache 的更复杂应用
    可以使用缓存来优化一些更复杂的函数或递归算法。例如,经典的斐波那契数列通过缓存可以大幅提升性能。

示例:

@lru_cache(maxsize=None)  # 无限大小的缓存
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(100))  # 使用缓存可以显著提高递归函数的效率
  1. 自定义缓存策略
    如果需要更灵活的缓存策略,比如控制缓存的过期时间、缓存失效等,可以使用第三方库,例如 cachetoolsdiskcache
    cachetools 库:
    cachetools 提供了多种缓存策略,包括 LRU、LFU(Least Frequently Used)、TTL(Time to Live)等。

安装:

pip install cachetools

示例:

from cachetools import cached, TTLCache

# 创建一个带有 TTL(生存时间)的缓存,缓存100个条目,且每个条目60秒过期
cache = TTLCache(maxsize=100, ttl=60)

@cached(cache)
def get_data(x):
    print(f"Fetching data for {x}...")
    return x * 2

print(get_data(10))  # 第一次调用会执行
print(get_data(10))  # 60秒之内不会重复执行

四、外部缓存工具

  1. 使用 Redis 作为缓存
    Redis 是一个高性能的键值对存储,可以作为缓存系统使用。Python 中有 redis-py 库来与 Redis 进行交互。

安装:

pip install redis

示例:

import redis
import pickle

# 连接到 Redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)

def cache_set(key, value, ttl=60):
    r.setex(key, ttl, pickle.dumps(value))  # 使用pickle序列化数据并设置缓存过期时间

def cache_get(key):
    value = r.get(key)
    return pickle.loads(value) if value else None  # 从Redis中获取并反序列化数据

# 缓存计算结果
key = 'expensive_result'
cached_value = cache_get(key)
if cached_value is None:
    cached_value = expensive_computation(10)  # 计算结果
    cache_set(key, cached_value)

print(cached_value)
  1. 使用 diskcache 持久化缓存
    diskcache 是一个纯 Python 实现的缓存库,支持将缓存写入磁盘,适用于数据量较大的场景。

安装:

pip install diskcache

示例:

import diskcache as dc

cache = dc.Cache('/tmp/my_cache')  # 指定缓存存储路径

@cache.memoize()
def heavy_computation(x):
    print(f"Computing {x}...")
    return x * x

print(heavy_computation(10))  # 结果会存储在磁盘上
print(heavy_computation(10))  # 第二次从磁盘缓存中获取

五、缓存的注意事项

  • 缓存失效: 缓存的数据不总是有效的,特别是当数据依赖于外部源时,可能需要手动管理缓存的失效时间或逻辑。
  • 内存管理: 如果缓存存储在内存中,需要注意控制缓存的大小,避免内存溢出。
  • 缓存一致性: 确保缓存中的数据和实际数据保持一致,尤其是在分布式系统中,这点尤为重要。
    通过缓存,Python 程序可以显著提升性能,尤其是在重复计算和 I/O 密集的场景中。

标签:10,缓存,Python,Cache,value,cache,computation,使用,print
From: https://blog.csdn.net/m0_55893050/article/details/142488023

相关文章

  • Logfire:Python 可观测性的强大工具
    Logfire是Pydantic团队推出的可观测性平台,为Python应用提供了深度洞察。它不仅仅是一个日志记录工具,更是一个全面的可观测性解决方案。Logfire的仪表板功能强大,提供了多个预构建的仪表板作为起点,如Web服务仪表板和系统衡量指标仪表板。Web服务仪表板可以显示请求总......
  • js弹窗组件sweetalert2使用
    经常会用到sweetalert2这个弹出层组件,整理记录下。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/>&l......
  • 阿里云ECS无法使用25端口发送短信解决方法
    phpmailer发邮件提示SMTP->ERROR:Failedtoconnecttoserver的解决方法写的网站本地测试发送短信成功,但是部署到阿里云ECS服务器上发送短信失败。打开cmd测试下telnetsmtp.163.com25 失败telnetsmtp.163.com465成功则解决方法如下配置的时候设置端口465,并加密SSL$mailer->......
  • TEDxDUTH 使用 NocoBase 实现革新
    作者:TEDxDUTHTEDxDUTH是由德莫克里特大学的志愿者们组成的一个充满活力的团队。作为TEDx全球社区的一员,我们的使命简单而有力:传播能够激励和引发改变的思想。我们通过精心策划一系列活动,成功汇聚了众多思想家、创新家以及行业领袖。我们的团队汇集了来自各个领域的热心志愿......
  • python编写第一个程序
     1、python是什么python是面向对象的解释型高级编程语言python是强类型的动态脚本语言2、编写第一个程序print("helloworld")运行py文件推荐使用方式:右键点击代码空白处,选择Run...3、bugSyntaxError:invalidcharacterinidentifier//输入错误print(“123”)#报错,......
  • TEDxDUTH 使用 NocoBase 实现革新
    作者:TEDxDUTHTEDxDUTH是由德莫克里特大学的志愿者们组成的一个充满活力的团队。作为TEDx全球社区的一员,我们的使命简单而有力:传播能够激励和引发改变的思想。我们通过精心策划一系列活动,成功汇聚了众多思想家、创新家以及行业领袖。我们的团队汇集了来自各个领域的热心志愿者,我们......
  • java中abstract关键字的使用案例
    创建动物父类跟狗猫子类abstractclassAnimal1{//抽象类Stringname;intage;Stringvariety;publicAnimal1(){}publicAnimal1(Stringname,intage,Stringvariety){//有参构造this.age=age;this.name=name;......
  • Python脚本
    importsubprocessimportjsoncurl_command=['curl','-s','http://localhost:8088/dc-summer/monitor/database/stat.session?timely=true']output=subprocess.check_output(curl_command).decode('utf-8')try:data=json.......
  • Anaconda 安装与使用教程
    目录1.[Anaconda简介](#anaconda-简介)2.[安装Anaconda](#安装-anaconda)3.[环境管理](#环境管理)1.[创建新环境](#创建新环境)2.[激活与退出环境](#激活与退出环境)3.[列出所有环境](#列出所有环境)4.[删除环境](#删除环境)5.[环境包管理](#环境包管理)1.......
  • Anaconda 安装与使用教程
    目录1.[什么是Anaconda](#什么是anaconda)2.[安装Anaconda](#安装anaconda)-[Windows系统安装](#windows系统安装)-[macOS系统安装](#macos系统安装)-[Linux系统安装](#linux系统安装)3.[Anaconda的基本组件](#anaconda的基本组件)-[AnacondaNavigator](#anaco......