[Leetcode刷题笔记]python3中functools模块

本文记录LeetCode刷题一些知识点,水平有限还望多多指正

斐波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, 且在 n >= 0 的条件下 Tn+2 = Tn + Tn+1
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

方法一:使用递归

class Solution:
    def fabonacci(self, n: int) -> int:
        if n<2:return n
        return self.tribonacci(n-1)+self.tribonacci(n-2)

结果:超时

改进:使用lru缓存加速

import functools
class Solution:
    @functools.lru_cache(None)
    def fabonacci(self, n: int) -> int:
       if n<2:return n
       return self.tribonacci(n-1)+self.tribonacci(n-2)

结果:38ms 13.8 MB

方法二:使用循环

class Solution:
    def fabonacci(self, n: int) -> int:
        a, b = 0, 1
        for i in range(n) :
            a, b = b, a+b
        return a

结果:40ms 13.8 MB

Note:functools模块

functools模块用于高阶函数,作用与或者返回其它函数的函数。一般来说,对于该模块,任何可调用对象都可以视为一个函数

  • @functools.lru_cache(maxsize=128, typed=False):该函数装饰器使用 LRU缓存算法来缓存相对耗时的函数结果,避免传入相同的参数重复计算。同时,缓存并不会无限增长,不用的缓存会被释放。其中 maxsize 参数用于设置缓存占用的最大字节数,typed 参数用于设置将不同类型的缓存结果分开存放。

除此之外模块中还有:

  • functools.cmp_to_key(func):将老式的比较函数(func)转换为关键字函数(key function)。在 Python 3 中比较大小、排序都是基于关键字函数的,Python 3 不支持老式的比较函数。

  • @functools.total_ordering:这个类装饰器(作用类似于函数装饰器,只是它用于修饰类)用于为类自动生成比较方法。通常来说,开发者只要提供 lt()、le()、gt()、ge() 其中之一(最好能提供 eq() 方法),@functools.total_ordering装饰器就会为该类生成剩下的比较方法。

  • functools.partial(func, *args, **keywords):该函数用于为 func 函数的部分参数指定参数值,从而得到一个转换后的函数,程序以后调用转换后的函数时,就可以少传入那些己指定值的参数。

  • functools.partialmethod(func, *args, **keywords):该函数与上一个函数的含义完全相同,只不过该函数用于为类中的方法设置参数值。

  • functools.reduce(function, iterable[, initializer]):将初始值(默认为 0,可由 initializer 参数指定)、迭代器的当前元素传入 function 函数,将计算出来的函数结果作为下一次计算的初始值、迭代器的下一个元素再次调用 function 函数……依此类推,直到迭代器的最后一个元素。

  • @functools.singledispatch:该函数装饰器用于实现函数对多个类型进行重载。比如同样的函数名称,为不同的参数类型提供不同的功能实现。该函数的本质就是根据参数类型的变换,将函数转向调用不同的函数。

  • functools.update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES:对 wrapper 函数进行包装,使之看上去就像 wrapped(被包装)函数。

  • @functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES):该函数装饰器用于修饰包装函数,使包装函数看上去就像 wrapped 函数。

通过介绍不难发现,functools.update_wrapper@functools.wraps 的功能是一样的,只不过前者是函数,因此需要把包装函数作为第一个参数传入;而后者是函数装饰器,因此使用该函数装饰器修饰包装函数即可,无须将包装函数作为第一个参数传入。

你可能感兴趣的:([Leetcode刷题笔记]python3中functools模块)