百独托管7500 紫田网络超高转化播放器收cps[推荐]速盾CDN 免实名免备防屏蔽阿里云 爆款特卖9.9元封顶提升alexa、IP流量7Q5团队
【腾讯云】中小企福利专场【腾讯云】多款产品1折起高防 随时退换 好耶数据小飞国外网赚带你月入万元炎黄网络4H4G10M 99每月
香港带宽CN2/美国站群优惠中客数据中心 服务器租用联盟系统移动广告平台 中易企业专场腾讯云服务器2.5折九九数据 工信部正规资质
腾讯云新用户大礼包代金券高价收cpa注册量高价展示【腾讯云】2核2G/9.93起租服务器找45互联 随时退换阿里云 短信服务 验证秒达

[其它内容] 用 `functools.lru_cache` 实现缓存 [复制链接]
查看:125 | 回复:1

1477

主题

1656

帖子

9

积分

落伍者(一心一意)

Rank: 1

贡献
685
鲜花
0
注册时间
2016-6-22

落伍者落伍微信绑定落伍手机绑定

发表于 2024-9-3 16:15:17 | 显示全部楼层 |阅读模式 来自 中国江苏淮安
华科云商丑图1.jpg
一、引言

在开发 Python 应用程序时,某些函数可能会被频繁调用且重复计算相同的结果。这不仅浪费资源,还可能导致性能瓶颈。为了解决这个问题,Python 提供了 `functools.lru_cache` 装饰器,它能够轻松实现函数结果的缓存,从而大幅提高应用的运行效率。本文将详细介绍如何使用 `functools.lru_cache` 实现缓存,并探讨其工作原理及应用场景。

二、什么是 `functools.lru_cache`?

`functools.lru_cache` 是 Python 标准库 `functools` 模块中的一个装饰器,用于为函数添加缓存功能。LRU 代表 "Least Recently Used"(最近最少使用),这意味着缓存会自动管理存储的条目,当缓存达到最大容量时,会优先删除最久未使用的条目。这种机制确保了缓存的空间得到了合理利用,避免了无限制增长。

三、`lru_cache` 的基本用法

1. 基本示例

要使用 `lru_cache`,只需在函数定义上添加装饰器。下面是一个简单的示例,演示如何缓存递归斐波那契函数的结果:

```python
import functools

@functools.lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 调用函数
print(fibonacci(10))  # 输出: 55
```

在这个示例中,`fibonacci` 函数的结果会被缓存。当函数被调用时,如果参数 `n` 的值之前已经计算过,`lru_cache` 会直接返回缓存的结果,而不再进行计算。

2. `maxsize` 参数

`lru_cache` 的 `maxsize` 参数用于指定缓存的最大容量,默认为 128。当缓存的条目数超过 `maxsize` 时,最久未使用的条目将被移除。如果你希望缓存无限制增长,可以将 `maxsize` 设置为 `None`:

```python
@functools.lru_cache(maxsize=None)
def my_function(x):
    # 函数体
```

需要注意的是,设置为无限制缓存可能会导致内存占用过高,需谨慎使用。

3. `typed` 参数

`lru_cache` 还支持 `typed` 参数,用于区分不同类型的参数。默认情况下,`lru_cache` 不区分相同值的不同类型(如 1 和 1.0)。设置 `typed=True` 后,1 和 1.0 将被视为不同的缓存条目:

```python
@functools.lru_cache(typed=True)
def my_function(x):
    return x
```

四、`lru_cache` 的工作原理

`lru_cache` 通过哈希表和双向链表实现。哈希表用于快速查找缓存的结果,而双向链表则维护条目的使用顺序。当缓存达到最大容量时,链表头部的条目(即最近最少使用的条目)将被移除,从而释放空间。

`lru_cache` 在缓存命中时,时间复杂度为 O(1),性能极佳。由于缓存只对不可变类型(如数字、字符串、元组)有效,因此使用时需要确保函数参数是可哈希的。

五、应用场景

1. 递归算法:如斐波那契数列、动态规划问题,通过缓存中间结果,减少不必要的重复计算。
2. 数据查询:对于重复查询的数据,可将查询结果缓存起来,避免重复访问数据库或文件系统。
3. 计算密集型函数:对于计算量大、重复调用的函数,通过缓存结果减少计算时间,提高性能。

六、注意事项

1. 缓存的有效性:`lru_cache` 适用于结果较为固定、不频繁变化的函数。如果函数结果可能会频繁变化,缓存可能会导致过期数据的问题。
2. 内存消耗:缓存虽然能提升性能,但也会占用内存资源。在内存紧张的环境下,应合理设置 `maxsize`,避免缓存过多数据。
3. 并发问题:`lru_cache` 并不是线程安全的,在多线程环境下使用时,可能需要额外的同步机制来保证缓存的一致性。

`functools.lru_cache` 是 Python 中一个非常实用的工具,它可以通过缓存函数结果,极大地提高函数的执行效率,特别是在处理递归算法和重复计算时。通过合理使用 `lru_cache`,开发者可以轻松优化应用程序的性能。然而,在使用缓存时,也需要考虑缓存的有效性和内存占用问题,以确保程序的稳定性和可靠性。
企业专线拨号VPS动态IP派克斯ADSL本地拨号,联系QQ174629754
回复

使用道具 举报

372

主题

1万

帖子

647

积分

落伍者(一心一意)

Rank: 1

贡献
2388
鲜花
0
注册时间
2020-6-17

落伍手机绑定落伍者

发表于 2024-9-6 10:55:09 | 显示全部楼层 来自 中国河南许昌
愿收录[url=http://www.ytllck.com/news/gongsi/]超声波流量计[/url]
[url=http://www.ytllck.com/products/]流量计厂家[/url]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2024-11-24 23:23 , Processed in 0.050728 second(s), 35 queries , Gzip On.

返回顶部