page contents

想给Python提速又不想改代码?用这个装饰器,自动缓存结果

Python标准库里就有一个现成的装饰器,叫lru_cache。用法特别简单。你在函数定义的地方,加一行@functools.lru_cache(maxsize=None)就行。

attachments-2026-09-anirNyrC6a9f66c90a8ed.png

写代码最怕什么?怕程序跑得慢。改代码更怕什么?怕改出bug

我懂你。很多Python程序员都有这种体验。辛辛苦苦写好的功能,一跑就是十几秒。领导催得急,客户等得烦。你盯着屏幕,脑子里全是怎么优化。

改算法?太麻烦。换语言?更不现实。有没有一种办法,能在不改动代码的前提下,让程序变快?

有。用这个装饰器,自动缓存结果。

装饰器是什么?简单说,它就像给函数穿了一件外套。外套不改变函数原本的样子,但能增加新功能。

缓存结果又是什么?你调用同一个函数时,如果传入的参数相同,返回的结果也应该相同。这种情况很常见。比如你写了个计算商品价格的函数,同样的商品、同样的折扣,算出来的价格肯定一样。第一次算完,把结果存起来。第二次再算,直接从缓存里拿。省掉了计算过程,速度当然飞快。

Python标准库里就有一个现成的装饰器,叫lru_cache。用法特别简单。你在函数定义的地方,加一行@functools.lru_cache(maxsize=None)就行。

看个例子:

import functools 

@functools.lru_cache(maxsize=None)

def compute_price(base_price, discount):

    假设这里有一大堆复杂的计算逻辑

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

   return base_price  discount

你看,代码一个字都没改。只是头顶多了个装饰器。第一次调用compute_price(100, 0.8),它真的会等两秒。第二次再调用同样的参数,瞬间就出结果。这不就是白捡的性能提升吗?

当然,缓存不是万能的。它适合那种“给定相同输入,永远得到相同输出”的函数。如果你写了一个返回当前时间的函数,每次调用结果都不同,那缓存反而会出错。还有,如果你的函数里用到了全局变量或者外部文件,也得小心。缓存只认参数,不认外部变化。

缓存大小也要注意。maxsize=None代表缓存数量无上限。如果你的函数可能会被无数种参数调用,那缓存会越存越多,吃光内存。这时候可以设定一个具体数字,比如maxsize=128。超出限制时,它会自动清理最不常用的缓存。

我身边一个同事,就是因为用了这个装饰器,把一个耗时3秒的接口降到了0.1秒。他什么都没改,就加了一行代码。领导还以为他重写了一遍逻辑,连连夸他技术厉害。他偷偷告诉我,秘密就在这个装饰器里。

其实不仅是lru_cache。Python还有个cache装饰器,是Python 3.9以后才加入的。它和lru_cache功能类似,使用起来更简单,连参数都不需要。如果你用Python 3.9及以上版本,直接写@functools.cache就行。

还有更灵活的用法。你可以自己写一个缓存装饰器,用字典存结果。虽然麻烦点,但能让你完全掌控缓存的逻辑。比如你想缓存一分钟就过期,或者根据参数的不同决定要不要缓存。这些都能自己实现。

不过对大多数人来说,直接用lru_cache就够了。它轻量、稳定、不用动脑子。关键是,它真的能帮你省时间。

说来说去,不改代码就能提速,这可能是Python程序员最幸福的时刻。你不需要学习新的编程技巧,不需要重构多个文件,只要在函数头上加个装饰器。简单到像给自行车装了个加速器,骑起来又快又省力。

下次你面对一个慢吞吞的函数,别急着改代码。先想想,这个函数有没有重复调用相同参数的情况?如果有,装上这个装饰器试试看。你会惊讶地发现,原来加速可以这么容易。

 更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2026-09-08 09:37
  • 阅读 ( 38 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2420 篇文章

作家榜 »

  1. Pack 2420 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章