Python functools 模块

functools 模块提供了一些用于高阶函数的工具,也适用于可调用的对象

cached_property(func)

这个函数简单说就是一个带缓存的@property, 可以把一个实例方法变成实例属性, 同时会缓存计算结果。假如说我在这个函数里面sleep 5秒钟, 那么我第二次调用时, 程序将会直接返回缓存的结果, 而不是再计算一次.
下面是一个超级超级简单的例子.

from functools import cached_property
import time

class DataSet:

    @cached_property
    def value(self):
        time.sleep(5)
        return 'a'

if __name__ == "__main__":
    dt = DataSet()
    t1 = time.time()
    print(dt.value)
    t2 = time.time()
    t3 = time.time()
    print(dt.value)
    t4 = time.time()
    print(t2 - t1, t4 - t3)

执行结果

a
a
5.005407094955444 1.3828277587890625e-05

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

lru_cache 是一个用于给函数增加缓存功能的装饰器. 用处是把一些开销比较大的函数的结果缓存起来, 下次调用的时候直接返回结果.
那么maxsize参数表示什么意思呢?

  1. 比如说设置maxsize 为 128 , 那么它就能缓存128个不同参数的调用, 要注意的是, 不同的传参顺序, 也被认为是不同的调用.
  2. 因为使用了字典存储缓存, 所以参数必须是可以哈希的.
  3. typed参数的作用是控制是否严格区分参数值的类型, 比如说3.0 和 3是否被认为是同一个参数值.
@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)

partial 偏函数

partial 会接受一个函数和一些参数作为参数, 并且把这个函数和接收到的参数组合起来, 作为一个新函数返回.

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18

@functools.wraps

这是一个便捷函数, 主要目的是为了在使用装饰器以后, 保留被装饰函数的原始信息.

>>> from functools import wraps
>>> def my_decorator(f):
...     @wraps(f)
...     def wrapper(*args, **kwds):
...         print('Calling decorated function')
...         return f(*args, **kwds)
...     return wrapper
...
>>> @my_decorator
... def example():
...     """Docstring"""
...     print('Called example function')
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
>>> example.__doc__
'Docstring'
展示评论