Python 中的 LRU 缓存2024年8月29日 | 阅读 7 分钟 在本教程中,我们将学习 Python 中的 LRU 缓存。我们将学习缓存策略以及如何使用 Python 装饰器、LRU 策略及其工作原理来实现它们。我们还将讨论如何通过使用 @lru_cache 装饰器进行缓存来提高性能。本教程将深入了解缓存的工作原理以及如何在 Python 中从中获益。首先,让我们了解什么是缓存及其用途。 缓存及其用途缓存是内存管理的一种最佳技术,它将最近或最常使用的数据存储在内存中,以便我们可以比从实际源访问更快或计算成本更低地访问它们。 LRU 缓存遵循先进先出格式。让我们以一个真实生活中的例子来更好地理解它。 假设我们正在创建一个网站,该网站会从不同的网站获取文章。当用户点击特定列表时,应用程序会下载文章并显示在屏幕上。 当用户决定返回到已访问的文章时会发生什么?如果我们的应用程序不支持缓存技术,它将一遍又一遍地下载相同的内容。这将使应用程序系统非常缓慢,并给托管文章的服务器带来额外压力。 在这种情况下,应用程序将在获取每篇文章后将内容本地存储。下次用户决定打开文章时,应用程序将从本地存储的副本中获取内容,而不是返回到资源。这项技术被称为缓存。 什么是 LRU 缓存?LRU 缓存称为 Least Recently Used(最近最少使用),这是一种常见的缓存策略,用于定义逐出元素并为新元素腾出空间的策略。当缓存已满时,它会首先丢弃最近最少使用的项目。在 LRU 中,有两种引用使用 -
使用 Python 字典实现缓存我们可以使用 Python 字典实现缓存解决方案。让我们以文章引用为例,而不是直接访问服务器,我们可以检查缓存并将其返回给服务器。让我们理解下面的例子。 示例 - 输出 Getting article... Fetching article from server... Getting article... Fetching article from server... 解释 - 在上面的代码中,我们可以看到我们得到了字符串“正在从服务器获取文章”,因为在第一次访问文章后,我们将它的 URL 和内容放入了缓存字典。当我们第二次运行代码时,我们不需要再次从服务器获取项目。 各种缓存策略我们需要有适当的策略来决定使应用程序更高效。在我们的应用程序中,当用户下载更多文章时,它会继续将它们存储在内存中,这可能导致应用程序崩溃。 合适的策略可以使用专注于管理缓存信息以及移除哪个项目以腾出新项目空间的算法来解决此类问题。有各种策略可以用来驱逐缓存并为新缓存腾出空间。让我们看看下面的流行缓存策略。
我们将在接下来的部分中使用 Python 的 functools 模块的 @lru_cache 装饰器。 LRU(最近最少使用)缓存策略LRU 策略以组织其项目的使用方式而闻名。当我们尝试访问 LRU 算法中的条目时,它会将该条目移到缓存的顶部。算法通过检查列表的底部来识别未使用的条目。 当新条目进来时,它会将第一个条目向下推。该算法假定如果一个对象已被使用,它在未来被需要的可能性更大。 在 Python 中创建 LRU 缓存在本节中,我们将使用 Python 的功能创建一个简单的 LRU 缓存实现。Python 带有称为 OrderedDict 的哈希表,它保留了键的插入顺序。我们使用以下策略来实现这一点。
示例 - 输出 OrderedDict([('1', '1'), ('3', '3'), ('4', '4')]) OrderedDict([('3', '3'), ('4', '4'), ('5', '5')]) 说明 让我们分解代码 -
使用 functools 在 Python 中创建 LRU 缓存在这里,我们将使用 functools 模块的 @lru_cache 装饰器。然而,@lru_cache 在后台使用它。我们可以将此装饰器应用于任何接受潜在键作为输入并返回相应数据对象的函数。优点是,当再次调用该函数时,如果相应的数据已存在于缓存中,装饰器将不会执行函数语句。 让我们理解下面的例子。 示例 - 输出 Cache miss with 1 1: value Cache miss with 2 2: value Cache miss with 3 3: value Cache miss with 4 4: value 4: value 3: value 1: value Cache miss with 7 7: value Cache miss with 6 6: value 3: value 1: value 基于时间和空间逐出缓存条目@lru_cache 装饰器仅在没有空间存储更多条目时才会逐出现有条目。如果条目足够,它们将一直存在,永远不会刷新。因此,我们可以实现此功能来更新缓存系统,使其在特定时间后过期。 我们可以使用 @lru_cache 来实现这一点,如前所述。如果调用者尝试访问已过期的项目,缓存将不会返回其内容,而是强制调用者直接从网络获取结果。 让我们理解以下示例 - 示例 - 让我们分解代码 -
我们可以通过根据各个条目的生存期来逐出条目,从而更复杂地实现此策略。 结论缓存是提高任何软件系统性能的重要策略。我们已经解释了一些与 LRU 相关的重要概念以及如何使用多种技术(如 @lru_cache 和 OrderDict)来实现它。它还包括使用 timeit 模块测量代码运行时间。 |
break 是 Python 中循环的控制语句。它用于管理循环的顺序。假设我们想结束一个循环并继续执行后面的代码;break 可以帮助我们做到这一点。当一个...
阅读 2 分钟
在下面的教程中,我们将了解如何借助 Python 编程语言创建身体质量指数 (BMI) 计算器。但在开始创建之前;让我们简要讨论一下身体质量指数 (BMI) 是什么。了解身体质量指数 (BMI) BMI,简称...
阅读 4 分钟
获取输入是与用户交互或获取数据以提供某些结果的一种方式。Python 提供了两种内置方法来从键盘读取数据。这些方法如下。input(prompt) raw_input(prompt) input() input 函数用于所有最新版本的 Python。它接受...
阅读 2 分钟
在本教程中,我们将学习将 Python 列表或其他可迭代对象拆分为块的各种选项。迭代器方法:Python 中的迭代器是用于在可迭代对象(如列表、元组、字典和集合)上进行迭代的项目。迭代器对象使用...
阅读 8 分钟
在许多竞争性考试中,我们会遇到查找中间数字的问题。考虑问题中给出的约束也很重要,例如最小比较次数。让我们看看该问题的不同解决方案。1. 传统方法在传统方法中,使用数学计算,中间元素将...
阅读 3 分钟
在本教程中,我们将学习如何在 Python 程序中声明全局变量。什么是全局变量?全局变量是指在函数内部和外部都可用的变量,前提是它们在函数外部定义,该函数是全局的...
5 分钟阅读
几乎所有数值模拟领域都使用线性和多项式方程。但在工程学中,它们最自然地用于线性方程组的分析领域。结构、弹性物质、热通量、电磁学、电路等等都属于一般……
阅读 6 分钟
二维码是一种条形码,数字设备可以轻松读取,并以方格状排列的像素字符串的形式携带数据。由于许多智能手机都内置了二维码扫描器,因此二维码经常被使用...
阅读20分钟
什么是?Python 图形编程是指使用 Python 编程语言为不同的应用程序创建图形用户界面 (GUI)。这可以包括桌面应用程序、Web 应用程序和移动应用程序。Python 提供了各种用于创建图形界面的库和框架,例如 Tkinter、PyQt、wxPython、PyGTK、...
5 分钟阅读
通常,当我们使用 print 语句打印一个字符串时,我们会使用另一个 print 语句在新的一行中打印另一个字符串。当我们编写一个 print 语句后,在其执行后,光标会自动移到新的一行。为什么会这样呢?我们不能...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India