Python面试题:在 Python 中,如何实现一个 LRU(最近最少使用)缓存?

在 Python 中,可以使用 collections.OrderedDictfunctools.lru_cache 来实现一个 LRU(最近最少使用)缓存。functools.lru_cache 是一个内置装饰器,可以直接用于缓存函数的结果。而如果你想实现一个自定义的 LRU 缓存,可以使用 collections.OrderedDict

下面是使用 collections.OrderedDict 实现一个简单的 LRU 缓存的示例:

from collections import OrderedDictclass LRUCache:def __init__(self, capacity: int):self.cache = OrderedDict()self.capacity = capacitydef get(self, key: int) -> int:if key not in self.cache:return -1else:self.cache.move_to_end(key)  # 将访问的key移动到末尾return self.cache[key]def put(self, key: int, value: int) -> None:if key in self.cache:self.cache.move_to_end(key)self.cache[key] = valueif len(self.cache) > self.capacity:self.cache.popitem(last=False)  # 弹出最左侧(最旧)的元素# 使用示例
lru_cache = LRUCache(2)
lru_cache.put(1, 1)
lru_cache.put(2, 2)
print(lru_cache.get(1))  # 返回 1
lru_cache.put(3, 3)      # 移除键 2
print(lru_cache.get(2))  # 返回 -1 (未找到)
lru_cache.put(4, 4)      # 移除键 1
print(lru_cache.get(1))  # 返回 -1 (未找到)
print(lru_cache.get(3))  # 返回 3
print(lru_cache.get(4))  # 返回 4

在这个实现中,LRUCache 类使用 OrderedDict 来保持插入元素的顺序。put 方法在插入新元素时,如果超过容量限制,则移除最旧的元素。get 方法在访问元素时,将其移动到末尾,以表示最近访问。

此外,如果你希望更方便地使用 LRU 缓存,可以直接使用 functools.lru_cache 装饰器。以下是一个示例:

from functools import lru_cache@lru_cache(maxsize=2)
def some_expensive_function(n):print(f"Computing {n}")return n * n# 使用示例
print(some_expensive_function(2))  # 输出 "Computing 2" 和 4
print(some_expensive_function(3))  # 输出 "Computing 3" 和 9
print(some_expensive_function(2))  # 直接输出 4,不会打印 "Computing 2"
print(some_expensive_function(4))  # 输出 "Computing 4" 和 16
print(some_expensive_function(3))  # 再次计算 3,因为之前的结果已被移除

使用 lru_cache 装饰器,可以轻松为函数添加缓存功能,并且不需要手动管理缓存的逻辑。maxsize 参数指定了缓存的最大容量。

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

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

相关文章

【SVPWM】空间矢量调制

SVPWM仿真模型 扇区315462 切换时间马鞍波 三角载波和马鞍波比较 三相电压 FFT分析 参考文献: 现代永磁同步电机控制原理及MATLAB仿真.袁雷.

live555关于RTSP协议交互流程

RTP在和h264 RTP在和h265 RTP载荷AAC live555闭环双向链表 概要 rtsp在交互的过程中用到很多协议:tcp,udp,rtp,rtcp,sdp等协议;该篇文章主要分析在live555中这些协议是什么时候被创建的,什么时候被使用的等协议相关流程。 TCP:服务器与客…

WPF学习(3) -- 控件模板

一、操作过程 二、代码 <Window x:Class"学习.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expressio…

树莓派pico入坑笔记,esp01/01s使用

目录 关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树莓派pico专栏 说明 关于at指令 WiFi的at指令 UDP的at指令 样例程序 调试助手端输入指令 sta端程序 效果 进阶使用 库函数说明 样例代码 关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树…

【随手记】python大规模数据读取

题目是MT3055 交换排列 python大规模数据读取用这个sys.stdin.read。 import sys input sys.stdin.read data input().split()这个是题解。 import heapqclass UnionFind:def __init__(self, size):self.parent list(range(size))def find(self, x):if self.parent[x] x:…

秋招突击——7/12——复习{每日温度、完全平方数、无重复最长子串}——新作{字节面试——控制多线程按照顺序输出}

文章目录 引言复习每日温度复习实现参考学习 完全平方数复习实现参考学习 无重复字符的最长子串复习实现参考学习 新作控制多线程输出Java实现线程——不使用锁实现使用synchronized关键实现——使用锁实现使用synchronized、wait和notify关键字实现 总结 引言 今天又要面试字…

Memcached:高性能分布式内存缓存的深度解析

一、璀璨登场&#xff1a;Memcached的基本概念 在浩瀚的数据处理世界中&#xff0c;Memcached犹如一颗璀璨的星辰&#xff0c;以其独特的魅力照亮了动态Web应用的加速之路。作为Memory Cache Daemon的简写&#xff0c;Memcached自诞生之初便肩负着优化性能、减轻数据库负担的重…

安全防御,防火墙配置NAT转换智能选举综合实验

一、实验拓扑图 二、实验需求 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 2、分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3、多出口环境基于带宽比例进行选路&#xff0c;但是&…

DP(3) | 0-1背包 | Java | LeetCode 1049, 494, 474 做题总结(474未完)

1049. 最后一块石头的重量 II 和 LC 416.分割等和子集 类似 思路&#xff08;我没有思路&#xff09;&#xff1a; 两块石头相撞&#xff0c;这里没有想到的一个点是&#xff0c;相撞的两个石头要几乎相似 以示例1为例&#xff0c;stones [2,7,4,1,8,1]&#xff0c;如果从左到…

R 绘图 - 中文支持

R 绘图 - 中文支持 R 是一种广泛使用的统计和数据分析编程语言&#xff0c;它提供了强大的绘图功能。然而&#xff0c;R 的默认设置并不直接支持中文&#xff0c;这可能会在使用 R 进行绘图时造成困扰&#xff0c;尤其是当需要在图表中添加中文标签或标题时。本文将介绍如何在…

Collections:专为集合框架而生的工具类

Collections 是 JDK 提供的一个工具类&#xff0c;位于 java.util 包下&#xff0c;提供了一系列的静态方法。 排序操作 reverse(List list)&#xff1a;反转顺序shuffle(List list)&#xff1a;洗牌&#xff0c;将顺序打乱sort(List list)&#xff1a;自然升序sort(List lis…

信道估计算法

Least Square Criteria 模型 输入导频序列&#xff0c; x ( n ) , n 0 , 1 , ⋯ , N − 1 x(n),n0,1,\cdots,N-1 x(n),n0,1,⋯,N−1 加性噪声序列&#xff1a; ω ( n ) , n 0 , 1 , ⋯ , N − 1 \omega(n), n 0, 1, \cdots, N-1 ω(n),n0,1,⋯,N−1 输出序列&#xff0c;…

ls命令学习记录2

1.用不同的颜色显示内容 ls --color 除了使用-F选项在文件和文件夹名称后面附加特殊的符号&#xff0c;还可以让shell用不同的颜色显示内容&#xff0c;这样就能够用另一种方法把不同的内容进行分类&#xff0c;将它们区分开来。 $ ls --color adblock_filters.txt fixm3u …

用 netsh wlan show profile 命令查看历史连接过的 wifi

netsh wlan show profile 命令是 Windows 命令行工具中 netsh 的一部分&#xff0c;netsh 是一个强大的网络配置工具。wlan 子命令用于管理和显示无线网络配置。通过 netsh wlan show profile 命令&#xff0c;你可以查看存储在系统中的无线网络配置文件。这些配置文件包含了连…

java中遍历数组的三种方式

文章目录 遍历数组的三种方式1.for循环(1)遍历一维数组(2)遍历二维数组 2.foreach遍历(1).遍历一维数组(2).遍历二维数组 3.Arrays里的toString方法(1).遍历一维数组(2).遍历二维数组 遍历数组的三种方式 1.for循环 (1)遍历一维数组 int[] arr {1,3,2,4,5}; for (int i 0;i…

(算法)硬币问题

问题&#xff1a;有1元&#xff0c;5元&#xff0c;10元&#xff0c;50元&#xff0c;100元&#xff0c;500元的硬币各有C1,C5,C10.C50,C100,C500个。 现在要用这些硬币来支付A元&#xff0c;最小需要多少枚硬币&#xff1f; 该题使用递归算法&#xff0c;利用局部最优解来推导…

最小二乘是什么?

最小二乘法&#xff08;Least Squares Method&#xff09;是一种统计方法&#xff0c;用于通过最小化观测数据与模型预测值之间的误差平方和来拟合数据。这种方法广泛应用于回归分析中&#xff0c;尤其是在线性回归模型中。 基本原理 最小二乘法的基本思想是找到模型参数&…

数学建模中的辅助变量、中间变量、指示变量

在数学建模中&#xff0c;除了决策变量外&#xff0c;还有一些其他类型的变量&#xff0c;如中间变量、辅助变量和指示变量。每种变量在模型中都有特定的用途和意义。以下是对这些变量的详细解释&#xff1a; 1. 决策变量&#xff08;Decision Variables&#xff09; 定义&am…

求职笔记day3

运动量3.5万步。五园连通未完成。 未考试&#xff0c;朋友建议按代码随想录的框架先刷对应的知识点。 代码随想录 (programmercarl.com) 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 单词倒排_牛客题霸_牛客网 (nowcoder.com)

5Python的Pandas:数据结构

Pandas是基于强大的NumPy库开发的&#xff0c;它继承了NumPy中的一些数据结构&#xff0c;也继承了NumPy的高效计算特性。 1.Python的数据类型 Python 提供了多种数据类型&#xff0c;用于存储和操作不同类型的数据。以下是一些主要的数据类型&#xff1a; 数值类型&#xff…