《Python编程基础》课件-6.6.5函数缓存机制_第1页
《Python编程基础》课件-6.6.5函数缓存机制_第2页
《Python编程基础》课件-6.6.5函数缓存机制_第3页
《Python编程基础》课件-6.6.5函数缓存机制_第4页
《Python编程基础》课件-6.6.5函数缓存机制_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

函数缓存机制教学目标1.了解函数缓存机制

2.掌握实现函数缓存的基本方法

函数缓存机制(FunctionCaching),也称为记忆化(Memoization),是一种优化技术,用于存储函数调用的结果,以便在相同输入下直接返回缓存值,而非重新计算。核心概念:函数缓存:存储函数输入-输出对的机制。记忆化:特定于纯函数的缓存形式,避免副作用。1、什么是函数缓存机制及其重要性

#非缓存函数示例defcompute(x,y):#接受两个参数print("Computing...")#模拟昂贵计算returnx+y#返回结果#调用多次相同参数result1=compute(1,2)#输出"Computing..."并返回3result2=compute(1,2)#再次输出"Computing..."并返回3(无缓存,重复计算)手动实现函数缓存通过装饰器或闭包,使用字典存储结果。这涉及定义一个包装函数,检查输入是否已缓存,若是则返回缓存值,否则计算并存储。核心概念:装饰器:函数包裹原函数,实现缓存逻辑。闭包:内部函数访问外部缓存字典。哈希键:将参数转换为可哈希类型,如tuple(args,**kwargs)。2.手动实现函数缓存的基本方法#手动缓存装饰器defmanual_cache(func):#接受原函数作为参数cache={}#初始化空字典作为缓存defwrapper(*args):#包装函数,接受任意位置参数key=tuple(args)#将参数转换为元组作为键(假设无kwargs)ifkeyincache:#检查键是否已存在print("Cachehit!")#命中缓存returncache[key]#返回缓存值else:result=func(*args)#调用原函数计算cache[key]=result#存储结果到缓存print("Cachemiss!")#未命中,新增returnresult#返回新计算值returnwrapper#返回包装函数基础示例通过一个求和函数展示缓存的实际运行,可视化缓存命中与未命中的过程。核心概念:缓存命中:键存在,直接返回。缓存未命中:计算并添加新键值对。3.函数缓存的简单代码示例#简单手动缓存示例cache_dict={}#全局缓存字典(或闭包内)defcached_multiply(x,y):#缓存乘法函数key=(x,y)#创建键元组ifkeyincache_dict:#检查缓存returncache_dict[key]#命中返回result=x*y#计算结果cache_dict[key]=result#存储到缓存returnresult#返回#调用示例print(cached_multiply(3,4))#未命中,计算12并存储print(cached_multiply(3,4))#命中,直接返回12print(cache_dict)#输出缓存内容:{(3,4):12}Python的标准库functools提供lru_cache装饰器,实现高效缓存,支持最大大小和LRU(最近最少使用)淘汰策略。这比手动方法更简洁,支持类型提示和关键字参数。核心概念:functools.lru_cache:内置装饰器,自动管理缓存。maxsize:缓存最大条目,None为无限。LRU淘汰:移除最近最少使用的项。4.

使用functools.partial实现柯里化importfunctools#导入functools模块@functools.lru_cache(maxsize=128)#应用LRU缓存,最大128项deffactorial(n):#阶乘函数ifn==0orn==1:#基线条件return1returnn*factorial(n-1)#递归调用(缓存优化)#使用示例print(factorial(5))#计算并缓存中间结果print(factorial(5))#直接从缓存返回print(factorial.cache_info())#输出CacheInfo(hits=1,misses=6,maxsize=128,currsize=6)函数缓存用于递归优化、API节流和数据处理管道。例如,在斐波那契计算中,缓存避免指数级重复;在Web服务中,缓存查询结果减少数据库负载。核心概念:递归优化:存储子问题结果。API缓存:减少外部调用。。5.函数缓存机制在实际场景中的应用importfunctools#导入模块@functools.lru_cache(maxsize=None)#无限缓存deffib(n):#斐波那契函数ifn<=1:#基线returnnreturnfib(n-1)+fib(n-2)#递归#应用示例print(fib(30))#快速计算大n值,缓存所有子结果print(fib.cache_clear())#清空缓存(可选重置)lru_cache装饰器基础使用是Pythonfunctools中缓存函数结果的工具,通过maxsize限大小,确保最近使用而非依赖手动。其使用的核心在于@缓存,并在实际中基础,用于递归非依赖字典。核心概念:lru_cacheLRU缓存;基础包括maxsize;装饰器强调最近使用。6.lru_cache装饰器基础使用fromfunctoolsimportlru_cache#导入@lru_cache(maxsize=32)#装饰,限32deffib(n):#斐波returnnifn<2elsefib(n-1)+fib(n-2)#递归print(fib(10))#55,缓存中间print(fib.cache_info())#输出命中未命中,如hits=8,misses=11缓存泄漏(无限增长)和不可哈希参数(需自定义键)。常见问题:副作用函数缓存错误;线程安全(lru_cache线程安全);过期数据。核心概念:缓存泄漏:无限缓存耗尽内存。不可哈希:自定义键处理列表等。线程安全:lru_cache内置支持。7.常见问题与最佳实践importfunctools#导入模块@functools.lru_cache(maxsize=32)#小缓存以防泄漏defrisky_func(x):#示例函数returnx*2#简单计算#问题示例:不可哈希参数try:risky_func([1,2])#报TypeError:unhashabletype:'list'exceptTypeErrorase:print(e)#处理异常#最佳实践:自定义键defhashable_key(args):#转换函数returntuple(tuple(a)ifisinstance(a,list)elseaforainargs)#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论