前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python性能提升大杀器:深入解析functools.lru_cache装饰器

Python性能提升大杀器:深入解析functools.lru_cache装饰器

作者头像
雷子
发布2024-02-06 18:02:20
1110
发布2024-02-06 18:02:20
举报

1、为什么需要缓存?

在编写程序时,经常会遇到需要计算某个函数的输出,然后在稍后的代码中多次使用该输出的情况。

如果每次需要计算时都重新运行函数,将浪费大量的计算时间。

缓存可以将函数的输出存储在内存中,以便以后可以直接获取,而无需重新计算。

这可以显著提高程序的性能,特别是在处理计算密集型任务时。

2. functools.lru_cache 简介

functools.lru_cache装饰器是Python标准库中的一种缓存工具

3. lru_cache的基本用法

使用functools.lru_cache非常简单。只需在要缓存的函数上添加装饰器即可

代码语言:javascript
复制
from functools import lru_cache
@lru_cache()
def function(arg):
    # 计算复杂的结果
    return result

这将自动为function函数添加缓存功能,以避免重复计算相同输入值的结果。

缓存大小限制

设置缓存的大小限制,以控制缓存的大小。

例如,要将缓存大小限制为1000个条目:

代码语言:javascript
复制
@lru_cache(maxsize=1000)
def function(arg):
    # 计算复杂的结果
    return result

当缓存达到最大大小时,最不常使用的结果将被清除以腾出空间。

代码语言:javascript
复制
expensive_function.cache_clear()

4. 高级用法和选项

typed 参数

默认情况下,lru_cache会将不同类型的参数视为相同的参数。如果希望根据参数的类型进行缓存,可以使用typed=True:

代码语言:javascript
复制
@lru_cache(typed=True)
def function_with_typed_cache(arg):
    # 根据参数类型进行缓存
    return result

5. 示例:使用lru_cache优化斐波那契数列计算

一个实际示例,演示如何使用lru_cache来优化斐波那契数列的计算:

代码语言:javascript
复制
from functools import lru_cache
import time
spend=int(time.time())
@lru_cache(maxsize=None)  # 不限制缓存大小
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

result = fibonacci(40)  # 非常快速
print(result)
print((time.time()-spend)*1000)

def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

result = fibonacci(40)  
print(result)
print((time.time()-spend)*1000)

结果:

代码语言:javascript
复制
102334155
4.015207290649414
102334155
56764.39905166626

6. 适用场景

何时使用lru_cache

当有昂贵的函数计算,并且希望避免重复计算时。

当需要快速访问最近使用的函数结果。

何时不使用lru_cache

当函数的结果占用大量内存,导致内存不足时。

当函数的参数具有大量可能的取值,缓存命中率很低。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-31,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com