目录:
Python 的 functools 模块提供了多种功能来增强函数行为、优化性能并支持函数式编程范式。
lru_cache 是一个装饰器,用于缓存函数调用结果,避免对相同参数的重复计算,特别适用于计算开销大或 I/O 密集的函数。
@functools.lru_cache(maxsize=128, typed=False)
示例:优化斐波那契数列计算
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 用于“部分应用”一个函数,即固定原函数的部分参数,生成一个新的可调用对象。
from functools import partial
def multiply(x, y):
return x * y
double = partial(multiply, 2) # 固定第一个参数为 2
print(double(5)) # 输出 10,相当于 multiply(2, 5)
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 用于保留被装饰函数的元信息(如 __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__) # 输出 '示例函数'
↶ 返回首页 ↶