python functools中的 lru_cache 和 singledispatch 装饰器

python functools中的 lru_cache 和 singledispatch 装饰器


1 LRU_CACHE

除了优化递归算法之外,lru_cache 在从 Web 中获取信息的应用中也能发挥巨大作用。

用来做缓存,能把相对耗时的函数结果进行保存,避免传入相同的参数重复计算。同时,缓存并不会无限增长,不用的缓存会被释放。

特别要注意,lru_cache 可以使用两个可选的参数来配置。它的签名是:

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

maxsize 参数指定存储多少个调用的结果。缓存满了之后,旧的结果会 被扔掉,腾出空间。为了得到最佳性能,maxsize 应该设为 2 的 幂。

typed 参数如果设为 True,把不同参数类型得到的结果分开保


2 singledispatch

@singledispatch 装饰的普通函数会变成泛函数(generic function)

作用和c++中函数的重载类似

    
    from functools import singledispatch
    
    
    @singledispatch
    def show(obj):
        print (obj, type(obj), "obj")
    
    #字符串
    @show.register(str)
    def _(text):
        print (text, type(text), "str")
    
    #int
    @show.register(int)
    def _(n):
        print (n, type(n), "int")
    
    
    #元祖或者字典均可
    @show.register(tuple)
    @show.register(dict)
    def _(tup_dic):
        print (tup_dic, type(tup_dic), "tup_dic")

Buy me a 肥仔水!