当前位置: 首页 > news >正文

Python缓存利器:cachetools库详解

Python缓存利器:cachetools库详解

    • 1. cachetools简介
    • 2. 安装
    • 3. 基本概念
      • 3.1 LRU Cache (Least Recently Used)
      • 3.2 TTL Cache (Time-To-Live)
      • 3.3 LFU Cache (Least Frequently Used)
    • 4. 使用示例
      • 4.1 使用LRU Cache
      • 4.2 使用TTL Cache
      • 4.3 使用LFU Cache
      • 4.4 缓存装饰器
    • 5. 进阶用法
      • 5.1 自定义键函数
      • 5.2 缓存统计
    • 6. 总结

在开发过程中,我们经常需要使用缓存来提高程序的性能。Python的cachetools库提供了一系列实用的缓存装饰器和缓存类,使得在Python中实现缓存变得简单而高效。本文将详细介绍cachetools库的基本概念和使用方法。

1. cachetools简介

cachetools是一个Python库,提供了各种内存缓存的实现。它可以用于函数结果缓存、对象缓存等场景,能够有效提升程序性能,减少重复计算。

主要特点:

  • 提供多种缓存策略(LRU, TTL, LFU等)
  • 支持缓存大小限制
  • 线程安全
  • 可用作装饰器,使用简单

2. 安装

使用pip安装cachetools:

pip install cachetools

3. 基本概念

3.1 LRU Cache (Least Recently Used)

LRU缓存会优先淘汰最近最少使用的项目。

3.2 TTL Cache (Time-To-Live)

TTL缓存中的项目在指定时间后过期。

3.3 LFU Cache (Least Frequently Used)

LFU缓存会优先淘汰使用频率最低的项目。

4. 使用示例

4.1 使用LRU Cache

from cachetools import LRUCache, cached# 创建一个最大容量为100的LRU缓存
@cached(cache=LRUCache(maxsize=100))
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)# 使用缓存的函数
print(fibonacci(100))

4.2 使用TTL Cache

from cachetools import TTLCache, cached
import time# 创建一个最大容量为100,过期时间为10秒的TTL缓存
cache = TTLCache(maxsize=100, ttl=10)@cached(cache)
def get_data():print("Fetching data...")return "Data"# 第一次调用,会打印"Fetching data..."
print(get_data())# 立即再次调用,使用缓存,不会打印"Fetching data..."
print(get_data())# 等待11秒后调用,缓存已过期,会再次打印"Fetching data..."
time.sleep(11)
print(get_data())

4.3 使用LFU Cache

from cachetools import LFUCache# 创建一个最大容量为100的LFU缓存
cache = LFUCache(maxsize=100)# 添加项目到缓存
cache['key1'] = 'value1'
cache['key2'] = 'value2'# 访问缓存
print(cache['key1'])# 当缓存满时,最不常用的项目会被移除

4.4 缓存装饰器

cachetools提供了方便的缓存装饰器:

from cachetools import cached, TTLCache
import time# 使用TTL缓存装饰器
@cached(cache=TTLCache(maxsize=100, ttl=30))
def get_weather(city):print(f"Fetching weather for {city}")# 模拟API调用time.sleep(2)return f"Sunny in {city}"# 第一次调用,会打印"Fetching weather..."
print(get_weather("Beijing"))# 立即再次调用,使用缓存结果
print(get_weather("Beijing"))# 不同参数调用,不会使用缓存
print(get_weather("Shanghai"))

5. 进阶用法

5.1 自定义键函数

可以自定义缓存的键生成函数:

from cachetools import cached, LRUCachedef make_key(func, *args, **kwargs):# 自定义键生成逻辑return str(args) + str(kwargs)@cached(cache=LRUCache(maxsize=100), key=make_key)
def my_function(arg1, arg2):return arg1 + arg2print(my_function(1, 2))
print(my_function(1, 2))  # 使用缓存

5.2 缓存统计

一些缓存类提供了统计信息:

from cachetools import LRUCachecache = LRUCache(maxsize=100)# 添加一些项目
for i in range(150):cache[i] = i * iprint(f"缓存大小: {len(cache)}")
print(f"缓存命中次数: {cache.hits}")
print(f"缓存未命中次数: {cache.misses}")

6. 总结

cachetools库为Python提供了强大而灵活的缓存解决方案。通过使用不同类型的缓存和缓存装饰器,我们可以轻松地在程序中实现高效的缓存机制,从而提升程序性能。在处理耗时的计算、频繁的API调用或需要重复访问的数据时,cachetools是一个非常有用的工具。

相关文章:

Python缓存利器:cachetools库详解

Python缓存利器:cachetools库详解 1. cachetools简介2. 安装3. 基本概念3.1 LRU Cache (Least Recently Used)3.2 TTL Cache (Time-To-Live)3.3 LFU Cache (Least Frequently Used) 4. 使用示例4.1 使用LRU Cache4.2 使用TTL Cache4.3 使用LFU Cache4.4 缓存装饰器 5. 进阶用法…...

【Python实战因果推断】20_线性回归的不合理效果10

目录 Neutral Controls Noise Inducing Control Feature Selection: A Bias-Variance Trade-Off Neutral Controls 现在&#xff0c;您可能已经对回归如何调整混杂变量有了一定的了解。如果您想知道干预 T 对 Y 的影响&#xff0c;同时调整混杂变量 X&#xff0c;您所要做的…...

在Ubuntu 16.04上安装和配置ownCloud的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 ownCloud 是一个文件共享服务器&#xff0c;允许您将个人内容&#xff08;如文档和图片&#xff09;存储在一个类似 Dropbox 的集…...

Java | Leetcode Java题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(int[] nums) {int length nums.length;if (length 1) {return nums[0];} else if (length 2) {return Math.max(nums[0], nums[1]);}return Math.max(robRange(nums, 0, length - 2), robRange(nums, 1,…...

使用 ESP32 接收 MAX4466 模拟麦克风模块的数据,通过 DAC 转码成 PCM 格式,并通过 MQTT 发送给另一台设备,可以通过以下步骤实现。

硬件准备 两个 ESP32 开发板MAX4466 模拟麦克风模块MQTT 服务器&#xff08;例如 Mosquitto&#xff09; 接线 MAX4466 模块输出&#xff08;AO&#xff09; -> ESP32 ADC 引脚&#xff08;如 GPIO 34&#xff09; 软件准备 音频采集DAC 转码MQTT 发送和接收 代码实现…...

SQL二次注入原理分析

二次注入在测试的时候比较少见&#xff0c;或者说很难被测出来&#xff0c;因为测的时候首先要去找注入的位置&#xff0c;其次是去判断第一次执行的SQL语句&#xff0c;然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。 下面以一个常用过滤方法…...

在线签约如何选择?2024年10款顶级app大比拼

支持电子合同签约的10大app&#xff1a;e签宝、上上签、DocuSign、契约锁、Adobe Sign、法大大、SignNow、安心签、HelloSign、PandaDoc。 无论是企业之间的交易还是个人服务合同&#xff0c;线上电子合同签约提供了一种便捷、高效且安全的方式来处理法律文档。本文将介绍几款优…...

gcc: warning: -Wunused-function;加了选项,为什么就不报警告呢?

文章目录 问题clang的编译而使用gcc是就不报问题分析原因如果是非static的函数问题 下面这个代码段,其中这个函数hton_ext_2byte,在整个程序里就没有使用。 static inline uint16_t hton_ext_2byte(uint8_t **p) {uint16_t v;******return v;...

系统提示我未定义与 ‘double‘ 类型的输入参数相对应的函数 ‘finverse‘,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…...

【电路笔记】-B类放大器

B类放大器 文章目录 B类放大器1、概述2、B类放大器介绍3、推挽式配置4、限制交叉失真5、B类放大器效率6、总结1、概述 我们在之前的文章中已经知道,A 类放大器的特点是导通角为 360,理论最大效率为 50%。 在本文中,我们将详细介绍另一类放大器,称为B类放大器,它是为解决A…...

Ubuntu 22.04 安装中文字体

笔者在用OpenCV4.9处理图片加水印时&#xff0c;中文乱码。原来是Ubuntu 22.04发行版缺少中文字体支持&#xff0c;因此&#xff0c;笔者就找资料安装了需要的中文字体&#xff0c;特此记录&#xff0c;以备后查。 1、打开终端&#xff1a; 2、更新软件包列表&#xff1a; su…...

「树莓派入门」树莓派进阶04-直流电机控制与PWM应用

直流电机控制是树莓派硬件项目中的一项重要技能。通过PWM技术,你可以实现对电机速度的精确控制。在实验过程中,请注意电机的电源匹配和GPIO引脚的保护。 一、直流电机基本原理 直流电机通过直流电源供电,其工作原理基于洛伦兹力定律,即电流通过线圈时,会在磁场中受到力的…...

利用数据集,用机器学习模型对股市预测,聊聊看!

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…...

015-GeoGebra基础篇-定点旋转物体、动态显示数值并显示运动轨迹

这可能是我能想到的最大概率可以被你搜索到的标题了&#xff0c;容我先喘口气~ 目录 一、成品展示二、涉及内容三、做图步骤&#xff08;1&#xff09;绘制三角形t&#xff08;2&#xff09;建立定点D&#xff08;3&#xff09;制作角度滑动条&#xff08;4&#xff09;图形绕点…...

2024年6月份找工作和面试总结

转眼间6月份已经过完了&#xff0c;2024年已经过了一半&#xff0c;希望大家都找到了合适的工作。 本人前段时间写了5月份找工作的情况&#xff0c;请查看2024年5月份面试总结-CSDN博客 但是后续写的总结被和谐了&#xff0c;不知道这篇文章能不能发出来。 1、6月份面试机会依…...

同步时钟:北斗/GPS卫星、电信基站、NTP以太网校时方式的区别

同步时钟是保证各设备时间统一的重要装置&#xff0c;广泛应用于电力、通信、金融、学校、医院、地铁等多个领域。目前&#xff0c;常用的同步时钟方式包括&#xff1a;北斗/GPS卫星、电信基站、NTP以太网等。 下面跟着小编来看一下这些校时方式及他们的区别吧。 1. 北斗/GP…...

实现Java应用的快速开发与迭代

实现Java应用的快速开发与迭代 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 随着软件开发周期的不断缩短和市场竞争的加剧&#xff0c;快速开发和…...

利用redis数据库管理代理库爬取cosplay网站-cnblog

爬取cos猎人 数据库管理主要分为4个模块&#xff0c;代理获取模块&#xff0c;代理储存模块&#xff0c;代理测试模块&#xff0c;爬取模块 cos猎人已经倒闭&#xff0c;所以放出爬虫源码 api.py 为爬虫评分提供接口支持 import requests import concurrent.futures import …...

数据仓库建模基础理论-01-为什么需要数据建模?

一、什么是数据模型&#xff1f; 数据模型是数据库的基础结构&#xff0c;用于描述和组织数据的方式。 它不仅是数据库的底层结构&#xff0c;还是一个概念性工具&#xff0c;帮助理解数据的含义和关系。 数据模型包括数据本身、数据之间的关系、数据的语义&#xff08;含义和…...

中序遍历的两种实现——二叉树专题复习

递归实现&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...