functools官方文档:functools — Higher-order functions and operations on callable objects — Python 3.10.5 documentation
functools是对已有的函数(callable对象)的进行操作,生成新的函数(callable对象)。本文介绍functools的函数和对象。
持续更新。
1. partial
partial对象的属性是函数func、位置参数、关键词参数。一般用于固定函数的某些参数,传入其他参数。如固定int(x,base)
函数中的base
入参(该函数的目标是将base进制的x转换为int格式的整数对象):
from functools import partial
basetwo = partial(int, base=2)
basetwo.__doc__ = 'Convert base 2 string to an int.'
print(basetwo('10010'))
输出:18
参考资料:
- python中偏函数functools.partial 的使用_万里鹏程转瞬至的博客-CSDN博客_functools.partial( 本文中介绍了functools相比重复定义新函数的优越性,以及介绍了位置参数和关键词参数的区别和引入方式。
2. lru_cache
在Python开发过程中,经常会遇到需要重复执行某些耗时操作的场景,比如递归计算、数据检索等。为了优化这些操作的执行效率,减少不必要的计算开销,Python的functools
模块提供了一个非常实用的装饰器——lru_cache
。本章将详细介绍lru_cache
的功能、工作原理以及如何在实际项目中使用它。
功能
lru_cache
(Least Recently Used Cache)是一种缓存方式,它可以将函数的返回值存储起来,当使用相同的参数再次调用函数时,直接从缓存中获取结果,而不是重新执行函数。这种方式特别适合于优化高成本的函数调用结果,尤其是在参数不变时可以显著提高程序的执行效率。
原理
lru_cache
实现的核心原理是“最近最少使用”(Least Recently Used)算法。具体来说,它会记录每次函数调用及其返回结果,并将这些信息存储在一个固定大小的缓存中。当缓存达到预设的大小限制时,它会自动删除最长时间未被使用的数据,为新的函数调用结果腾出空间。这种策略既保证了缓存的高效利用,又避免了内存的无限增长。
使用示例:斐波那契数列计算
首先,需要从functools
模块中导入lru_cache
装饰器:
from functools import lru_cache
斐波那契数列是一个典型的递归调用示例,未优化的递归调用会导致大量的重复计算。通过使用lru_cache
,可以显著提高计算效率。
未使用lru_cache
之前的斐波那契数列函数定义如下:
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
为了提高函数的执行效率,我们使用lru_cache
对其进行优化:
@lru_cache(maxsize=128)
def fibonacci_cached(n):
if n < 2:
return n
return fibonacci_cached(n-1) + fibonacci_cached(n-2)
在这个例子中,@lru_cache(maxsize=128)
是一个装饰器,它会自动缓存最多128次函数调用的结果。这意味着当fibonacci_cached
函数被递归调用时,如果之前已经计算过相同的n
值,那么可以直接从缓存中获取结果,而无需再次进行计算。
使用lru_cache
之后,对于计算较大的斐波那契数(比如第40项),速度会有显著提升。这是因为递归过程中的重复计算被有效避免,每个中间结果都被妥善缓存,供后续调用直接使用。
结论
通过使用functools
模块中的lru_cache
装饰器,可以非常便捷地实现函数结果的缓存,从而提高程序的执行效率,特别适用于优化递归函数或其他高成本的函数调用。这是提升Python程序性能的一种简单而有效的手段。