Python之@cache装饰器的使用及说明

 更新时间:2025年12月22日 15:35:16   作者:Tipriest_  
@cache是Python3.9引入的新装饰器,用于缓存函数结果,避免重复计算,提高性能,它基于functools.lru_cache实现,支持无限大小缓存,适用于纯函数,使用示例包括递归斐波那契数列和模拟耗时计算,注意适用场景、参数限制和内存占用,与@lru_cache相比,@cache更简洁,但功能单一

一、@cache装饰器的基本概念

@cache 是 Python 3.9 引入的新功能,来源于标准库 functools 模块。它的作用是 对函数结果进行缓存(记忆化 memoization),从而避免重复计算,提高程序性能。

它的定义方式非常简单:

from functools import cache

@cache
def some_function(...):
    ...

当你用 @cache 修饰一个函数时,Python 会将该函数的输入参数与计算结果自动保存到一个缓存(字典)中。当后续调用该函数且参数完全相同时,不会再次执行函数体的计算逻辑,而是直接返回之前缓存的结果。

二、工作原理

@cache 装饰器内部其实是基于 functools.lru_cache 实现的,它等价于:

from functools import lru_cache

cache = lru_cache(maxsize=None)

也就是说:

  • 无限大小缓存maxsize=None 表示缓存结果没有数量限制,会根据需要一直增长(直到你的内存允许)。
  • 键值匹配:缓存根据参数 判断是否命中(必须是可哈希类型,如数字、字符串、元组等)。
  • 返回缓存结果:命中缓存时,直接返回结果而不执行函数计算。

三、使用示例

1. 基本示例:递归斐波那契数列

from functools import cache

@cache
def fib(n):
    print(f"计算 fib({n})")
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(10))  # 第一次需要计算
print(fib(10))  # 第二次直接命中缓存,不会重新计算

运行效果:

  • 第一次调用会完整计算 fib(10),输出多行 "计算 fib(n)" 的提示信息。
  • 第二次调用相同参数,直接返回缓存值,不输出任何计算日志。

2. 模拟耗时计算

import time
from functools import cache

@cache
def slow_function(x):
    print(f"开始计算 {x}...")
    time.sleep(2)  # 模拟耗时
    return x * x

# 首次调用耗时
print(slow_function(5))

# 第二次调用相同参数时几乎立即返回
print(slow_function(5))

在实际场景中,如果一个函数计算代价高(如数据库查询、大文件解析、复杂计算等),使用 @cache 能显著减少重复工作。

四、注意事项

适用场景

  • 适合纯函数(函数结果只依赖输入参数,且不会产生副作用)。
  • 不适合需要每次实时更新的函数(例如获取当前时间、外部数据接口)。

参数限制

  • 参数必须可哈希(hashable),如整数、字符串、元组等。
  • 如果传入不可哈希类型(如列表、字典),会报错 TypeError: unhashable type

内存占用

  • @cache 默认缓存无限大小,可能造成内存占用增加;如果希望限制缓存大小,应使用 lru_cache(maxsize=...) 来控制。

缓存失效

  • @cache 没有内置超时或自动失效机制,缓存会一直保留直到程序结束或手动清除:
your_function.cache_clear()

五、@cache与@lru_cache的区别

特性@cache@lru_cache
缓存大小限制无限 (maxsize=None)可自定义 maxsize
缓存策略简单字典保存LRU(Least Recently Used)淘汰
用途适合始终命中缓存且参数种类有限适合缓存有限结果并自动淘汰旧数据

六、总结

  • @cache 能让函数的重复调用变得快速,尤其适合计算昂贵且参数唯一性高的场景。
  • 它是 @lru_cache(maxsize=None) 的简化版,功能单一但使用更简洁。
  • 使用时需注意内存占用和参数类型,确保函数是“纯”的(无副作用)。
  • 对于需要缓存大小控制的场景或更复杂的缓存管理,应使用 lru_cache

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • tensorflow转onnx的实现方法

    tensorflow转onnx的实现方法

    本文主要介绍了tensorflow转onnx的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python Tkinter之事件处理详解

    Python Tkinter之事件处理详解

    事件处理,是 GUI 程序中不可或缺的重要组成部分,相比来说,控件只是组成一台机器的零部件。本文我们将对 Tkinter 中的事件处理机制做详细的介绍,需要的可以参考一下
    2022-01-01
  • Python虚拟环境创建和使用方法(使用自带的venv模块)

    Python虚拟环境创建和使用方法(使用自带的venv模块)

    这篇文章主要如何在Python中使用虚拟环境,包括创建、激活、使用、生成requirements.txt文件、卸载包和删除虚拟环境,虚拟环境有助于隔离项目依赖,避免版本冲突,并便于部署,需要的朋友可以参考下
    2024-12-12
  • python语句中end=‘ ‘的作用及说明

    python语句中end=‘ ‘的作用及说明

    这篇文章主要介绍了python语句中end=‘ ‘的作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Python中的类的定义和对象的创建方法

    Python中的类的定义和对象的创建方法

    object 是 Python 为所有对象提供的 基类,提供有一些内置的属性和方法,可以使用 dir 函数查看,这篇文章主要介绍了Python中的类的定义和对象的创建,需要的朋友可以参考下
    2022-11-11
  • Flask-Docs自动生成Api文档安装使用教程

    Flask-Docs自动生成Api文档安装使用教程

    这篇文章主要为大家介绍了Flask-Docs自动生成Api文档安装使用教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Python flask框架请求体数据、文件上传、请求头信息获取方式详解

    Python flask框架请求体数据、文件上传、请求头信息获取方式详解

    这篇文章主要介绍了Python flask框架请求体数据、文件上传、请求头信息获取方式详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • pandas.DataFrame的pivot()和unstack()实现行转列

    pandas.DataFrame的pivot()和unstack()实现行转列

    这篇文章主要介绍了pandas.DataFrame的pivot()和unstack()实现行转列,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • pytest基本用法简介

    pytest基本用法简介

    这篇文章主要介绍了pytest基本用法简介,帮助大家更好的利用python进行自动化测试,感兴趣的朋友可以了解下
    2021-03-03
  • python实现扫雷小游戏

    python实现扫雷小游戏

    这篇文章主要为大家详细介绍了python实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04

最新评论