【python 内置模块】functools

2024-01-20 00:00:00

目录:

Python 的 functools 模块提供了多种功能来增强函数行为、优化性能并支持函数式编程范式。

lru_cache 函数缓存

lru_cache 是一个装饰器,用于缓存函数调用结果,避免对相同参数的重复计算,特别适用于计算开销大或 I/O 密集的函数。

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

  • maxsize 设置缓存最大条目数(None 表示无限制)
  • typed 决定是否区分参数类型(如 3 和 3.0)

示例:优化斐波那契数列计算

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)
print(fib(10))  # 输出 55
print(fib.cache_info())  # 查看缓存命中情况
# 55
# CacheInfo(hits=8, misses=11, maxsize=None, currsize=11)

缓存信息包括命中次数(hits)、未命中次数(misses)。

注意:对于纯函数(输入相同则输出必然相同),lru_cache 能极大提升性能;但对于有副作用或依赖外部状态的函数,使用缓存可能导致错误结果。

partial 参数绑定

partial 用于“部分应用”一个函数,即固定原函数的部分参数,生成一个新的可调用对象。

from functools import partial

def multiply(x, y):
    return x * y

double = partial(multiply, 2)  # 固定第一个参数为 2
print(double(5))  # 输出 10,相当于 multiply(2, 5)

reduce 折叠结果

reduce 对可迭代对象(如列表)中的元素从左到右进行计算,最终返回一个单一结果。

from functools import reduce

# 累积
result = reduce(lambda x, y: x * y, [1, 2, 3, 4])
print(result)  # 输出 24

# 累和
result = reduce(lambda x, y: x + y, [1, 2, 3, 4])
print(result)  # 输出 10

wraps 装饰器辅助

在编写自定义装饰器时,wraps 用于保留被装饰函数的元信息(如 __name____doc__),避免调试和文档生成时信息丢失。

未使用 wraps() 的装饰器

def my_decorator(func):
    # @wraps(func)
    def wrapper(*args, **kwargs):
        print("调用前")
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def example():
    """示例函数"""
    pass

print(example.__name__)  # 输出 'wrapper'
print(example.__doc__)   # 输出 None

使用 wraps() 的装饰器

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("调用前")
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def example():
    """示例函数"""
    pass

print(example.__name__)  # 输出 'example',而非 'wrapper'
print(example.__doc__)   # 输出 '示例函数'

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: