functools:对callable对象的高位函数和操作(持续更新ing...)

诸神缄默不语-个人CSDN博文目录

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

参考资料:

  1. 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程序性能的一种简单而有效的手段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值