funtools模块属于python内置模块,下面看一些常用方法
reduce() 函数来自 functools 模块
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
例子
l = [1,2,3,4]
# (((1+2)+3)+4)
print(functools.reduce(lambda x,y:x+y,l))
应用:将数位数组转化成整数
from functools import reduce
print(reduce(lambda a,b:a*10+b,[1,2,3,4]))
偏函数partial,来自functools模块下。
简单总结
functools.partial
的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
为什么有偏函数?
我们知道,通过设定参数的默认值,可以降低函数调用的难度,比如int()函数,默认是将字符串转换成10进制,相当于int(s,base = 10),这是Py语法的默认值。用户也可以自定义一个想要的默认值的方法,作用是:当某个函数被大量调用时,每次都要传参,非常麻烦,这时候就可以用偏函数简化了
# 偏函数
bin2int = functools.partial(int,base = 2)
# 定义了一个新的函数int2bin,该函数修改了int方法的默认参数,修改为 int(s,base = 2)
print(bin2int(s)) # 二进制100对应的是4
cache()来自functools模块
相比@lru_cache, @cache 装饰器更轻量化,速度更快,且是线程安全,不同线程可以调用同1个函数,缓存值可以共享。
lru_cache()来自functools模块
一个为函数提供缓存功能的装饰器,缓存 maxsize 组传入参数,在下次以相同参数调用时直接返回上一次的结果。用以节约高开销或I/O函数的调用时间。提升递归函数的执行效率.
lru_cache
是: Last recently used cache
的简写,
@functools.lru_cache(maxsize=128, typed=False)
import time
from functools import lru_cache
start = time.time()
@lru_cache() # 注释掉这行对比两次运行的时间差
def accu_demo():
time.sleep(3)
return 22 + 88
print(accu_demo())
print(accu_demo())
print(time.time() - start)
cached_property()来自functools模块
@cached_property
是一个装饰器,它将类的方法转换为属性,其值仅计算一次,然后缓存为普通属性。
调用: : instance.method
取代旧方式 : instance.method()
因此,只要实例持久存在,缓存的结果就可用,我们可以将该方法用作类的属性那样来使用,如
import functools
import time
class Sample():
def __init__(self,l):
self.l = l
@functools.cached_property
# 加了这个注解以后方法s就变成了一个属性了
def s(self):
time.sleep(2)
return sum(self.l)
start = time.time()
obj = Sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# print(obj.s())
print(obj.s)
print(obj.s)
print(time.time()-start)
# 不加注解 4s
# 加注解 2s
综上所述,建议如下:
1) 如果程序规模小,或多线程编程时,可使用@cache 装饰器。
2) 如果程度规模大,并且是长时间运行,建议使用@lru_cache 装饰器,使用方法灵活,但要注意控制缓存数量,必要时手工清理。
3) 编写类代码时,如需将某项复杂运算结果像属性那样访问时,使用@cached_property装饰器。