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

[其它内容] 使用functools.lru_cache为函数添加缓存提高性能 [复制链接]
查看:115 | 回复:1

1477

主题

1656

帖子

9

积分

落伍者(一心一意)

Rank: 1

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

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

发表于 2024-8-15 16:36:52 | 显示全部楼层 |阅读模式 来自 中国江苏淮安
华科云商丑图1.jpg
在日常的编程中,我们常常需要编写一些重复调用的函数,这些函数的计算可能会消耗大量时间和资源。为了提高程序的效率,缓存(Caching)是一种常见且有效的技术。Python的`functools.lru_cache`提供了一个简单而强大的方法来为函数添加缓存,从而提升程序的性能。本文将探讨如何使用`functools.lru_cache`优化函数,并解释其工作原理和适用场景。

什么是`functools.lru_cache`?

`functools.lru_cache`是Python标准库中的一个装饰器,它用于将函数的结果进行缓存。LRU代表“Least Recently Used”(最近最少使用),这意味着当缓存达到指定的大小限制时,最不常用的缓存条目将被自动移除。通过将计算结果缓存起来,`lru_cache`避免了对相同输入的重复计算,从而显著提升性能。

`lru_cache`的基本用法

使用`lru_cache`非常简单,只需要在函数定义上方加上`@lru_cache`装饰器即可。例如,考虑一个计算斐波那契数列的函数:

```python

from functools import lru_cache

@lru_cache(maxsize=None)

def fibonacci(n):

  if n < 2:

      return n

  return fibonacci(n-1) + fibonacci(n-2)

# 测试

print(fibonacci(10))  # 输出55

```

在这个例子中,`fibonacci`函数递归计算斐波那契数列。通过`@lru_cache`装饰器,函数的计算结果被缓存起来。当函数再次被调用时,如果传递的参数之前已经计算过,函数将直接返回缓存的结果,而不必重新计算。

参数详解

- **maxsize**: 这是缓存的最大容量。如果设置为`None`,缓存将无限增长。一般来说,设置一个合理的缓存大小有助于平衡内存使用和性能。

- **typed**: 如果设置为`True`,将根据不同的参数类型分别缓存结果。默认情况下,`lru_cache`不区分参数的类型。

性能提升的实例

让我们通过一个更复杂的示例来观察性能提升。假设我们有一个需要大量计算的函数,比如计算某个数据集的统计值:

```python

import time

from functools import lru_cache

@lru_cache(maxsize=128)

def expensive_computation(data):

  time.sleep(2)  # 模拟耗时计算

  return sum(data) / len(data)

# 第一次调用

start_time = time.time()

print(expensive_computation((1, 2, 3, 4, 5)))  # 计算需要2秒

print("Time taken:", time.time() - start_time)

# 第二次调用,使用缓存

start_time = time.time()

print(expensive_computation((1, 2, 3, 4, 5)))  # 计算几乎是即时的

print("Time taken:", time.time() - start_time)

```

在这个例子中,第一次调用函数时,程序会花费2秒钟来计算结果。而第二次调用时,由于参数相同,结果将从缓存中获取,这显著减少了计算时间。

注意事项

尽管`lru_cache`非常强大,但在使用时需要注意以下几点:

1. **内存使用**:缓存会占用内存,因此在处理大量数据时,需要合理设置`maxsize`,避免内存泄漏。

2. **可变参数**:对于接受可变对象(如列表、字典等)作为参数的函数,`lru_cache`无法正常工作,因为可变对象是不可哈希的。可以通过将这些参数转换为不可变类型(如元组)来解决这个问题。

3. **过期缓存**:`lru_cache`没有过期机制,如果你的数据会随时间变化,可能需要手动管理缓存的刷新。

`functools.lru_cache`提供了一个简单而有效的方式来提升函数的性能,特别是对于那些计算量大且重复调用的函数。通过合理使用缓存,可以显著减少计算时间,提高程序的整体效率。然而,在使用时也需要根据具体场景进行合理配置,以充分发挥其优势。
企业专线拨号VPS动态IP派克斯ADSL本地拨号,联系QQ174629754
回复

使用道具 举报

372

主题

1万

帖子

647

积分

落伍者(一心一意)

Rank: 1

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

落伍手机绑定落伍者

发表于 2024-8-16 14:05:39 | 显示全部楼层 来自 中国河南开封
愿收录[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-25 01:00 , Processed in 0.044369 second(s), 34 queries , Gzip On.

返回顶部