当前位置:首页>编程日记>正文

python functools.reduce_Python-functools模块(reduce、partial、lru_cache)

functools模块

reduce

functools.reduce(function, sequence[, initial]) -> value

就是减少的意思

初始值没提供就在可迭代对象中取一个

from functools importreduceprint(sum(range(10),100))print(reduce(lambda x,y:x+y,range(10),100))#输出都是 145

from functools importreduce

reduce(lambda x,y:x*y,range(1,5)) #求阶乘

上一次lambda函数的返回值会成为下一次的x

partial(偏函数)

把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回这个函数

函数本质:

def partial(func, *args, **keywords):def newfunc(*fargs, **fkeywords):

newkeywords=keywords.copy()

newkeywords.update(fkeywords)return func(*args, *fargs, **newkeywords)

newfunc.func=func

newfunc.args=args

newfunc.keywords=keywordsreturn newfunc

示例:

from functools importpartialimportinspectdefadd(x,y):return x +y

newadd= partial(add,y=10) #相当于固定了y这个参数,y必须通过keyword关键字传参

newadd(4),newadd(x=4),newadd(y=10,x=10),newadd(x=10,y=11),newadd(4,y=5) #y

#输出 (14, 14, 20, 21, 9)

inspect.signature(newadd)#

newadd(4,5) 错误的本质在于,它等价于 newadd(4,5,y=10) y值拿到了两个值,此处y则不能通过位置传参

def add(x,y,*args):return x + y +sum(args)

newadd= partial(add,1,2,3,4,5)

inspect.signature(newadd)# #签名是可变位置参数,则说明不能使用keyword传参

newadd(),newadd(10),newadd(3,4),newadd(3,4,5)#(15, 25, 22, 27)

#newadd(x=1,y=1) 错误写法,不能使用keyword传参

defadd(x,y):return x +y

newadd= partial(add,x=10,y=20)

newadd(),newadd(x=20,y=10)#(30, 30)

lru_cache

@functools.lru_cache(maxsize=128,typed=False)

lru表示最近最少使用,cache缓存

如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制的增长,maxsize是2的幂,LRU功能执行的最好

如果typed设置为True,则不同类型的函数参数将单独的缓存,例如,f(3),f(3.0)将被视为具有不同结果的不同调用

Python3.8简化了函数调用

importfunctools

@functools.lru_cachedefadd(x,y):pass

#等价于

@functools.lru_cache(maxsize=128)defadd(x,y):pass

importtimeimportfunctools

@functools.lru_cache()defadd(x,y):

time.sleep(3)print('-' * 20)return x +yprint(add(4,5))print(add(4,5))print(add(4.0,5))print(add(4,y=5))print(add(x=4,y=5))print(add(y=5,x=4))#前三种都视为同一种,会被缓存命中,后三种则不能被命中#输出

--------------------

9

应用

lru_cache装饰器的应用,求斐波那契数列的值

@functools.lru_cache()def fib(n,a=0,b=1):return 1 if n < 3 else fib(n-1) + fib(n-2)

fib(101)573147844013817084101

###############################

from functools importlru_cache

@lru_cache()def fib(n,a=0,b=1):return 1 if n < 3 else fib(n-1) + fib(n-2)

总结

lru_cache装饰器应用

使用前提:

同样的函数参数一定得得到同样的结果,至少是一段时间内,同样的输入得到同样的结果

计算代价高,函数执行时间过长

需要多次执行,每次计算的结果一样

缺点:

不支持过期缓存清理,key无法过期,失效

不支持清理

不支持分布式,是一个单机的缓存

适用场景:单机上需要空间换时间的地方,可以用缓存来将计算编程快速查询


http://www.coolblog.cn/news/408023c387d3f428.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • 2019-9
  • jquery 使用小技巧
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • linux批量创建用户和密码
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • js常用阻止冒泡事件
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • 【设计模式】 模式PK:策略模式VS状态模式
  • JS实现-页面数据无限加载
  • CSS小技巧——CSS滚动条美化
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里巴巴分布式服务框架 Dubbo
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 两张超级大表join优化
  • Arm芯片的新革命在缓缓上演
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • 《看透springmvc源码分析与实践》读书笔记一
  • nagios自写插件—check_file
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • python3 错误 Max retries exceeded with url 解决方法
  • 通过Spark进行ALS离线和Stream实时推荐
  • 行为模式之Template Method模式