python的funtools模块常用方法

funtools模块

funtools模块属于python内置模块,下面看一些常用方法

reduce函数

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

cache()来自functools模块

相比@lru_cache, @cache 装饰器更轻量化,速度更快,且是线程安全,不同线程可以调用同1个函数,缓存值可以共享。

@lru_cache

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

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装饰器。

你可能感兴趣的:(python,python)