Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >leetcode每日一题:509. 斐波那契数

leetcode每日一题:509. 斐波那契数

作者头像
用户7685359
发布于 2021-01-08 02:06:03
发布于 2021-01-08 02:06:03
37100
代码可运行
举报
文章被收录于专栏:FluentStudyFluentStudy
运行总次数:0
代码可运行
leetcode每日一题:509. 斐波那契数:

https://leetcode-cn.com/problems/fibonacci-number/

一起刷题吧

一、参考答案

因为这个题目过于简单,这里直接给出参考答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
F = [0, 1, 1]

for i in range(28):
    F.append(F[-1] + F[-2])


class Solution:
    def fib(self, n: int) -> int:
        if not n:
            return 0
        return F[n]

当然也可以采用递归的写法。这里主要想介绍Pythonfunctools下比较常用的装饰器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@functools.lru_cache(user_function)
@functools.lru_cache(maxsize=128, typed=False)

二、关联知识

functools.lru_cache,首先,它是一个装饰器,主是作用是减少重复计算,即当函数的参数重复时,则直接采用原来计算好的结果。因此可以看出,它底层判断重复,是通过函数的参数。因此我们需要注意,它是使用dict来做缓存,因此函数的位置参数和关键字参数必须是可哈希的。

它是一个非常实用的装饰器,实现了备忘的功能,可以将耗时的结果存储起来,避免传入相同的参数时重复计算。同时需要注意的,它也可以接受一个自定的func,只要是可调用的即可。

示例(来自官方文档):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@lru_cache(maxsize=32)
def get_pep(num):
    'Retrieve text of a Python Enhancement Proposal'
    resource = 'http://www.python.org/dev/peps/pep-%04d/' % num
    try:
        with urllib.request.urlopen(resource) as s:
            return s.read()
    except urllib.error.HTTPError:
        return 'Not Found'

>>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
...     pep = get_pep(n)
...     print(n, len(pep))

>>> get_pep.cache_info()
CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)

当不指定maxsize,即值为None时,缓存大小是没有边界的(在生产环境下是很危险的,很容易OOM),示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)

三、相关面试题

  1. 缓存淘汰策略
  2. 如何自己实现一个lru算法
  3. 你用过哪些Python装饰器
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FluentStudy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 509. 斐波那契数
斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
村雨遥
2020/04/09
3150
Python 2.7即将停止维护,3.X炫酷新特性你都了解吗?
导读:从 3.0 到 3.8,Python 3 已经更新了一波又一波,但似乎我们用起来和 2.7 没有太大区别?以前该怎么写 2.7 的代码现在就怎么写,只不过少数表达方式变了而已。在这篇文章中,作者介绍了 3.0 以来真正 Amazing 的新函数与新方法,也许这些方法我们都不太熟,但它们确实在实践中非常重要。
IT阅读排行榜
2019/05/24
4410
Python 2.7即将停止维护,3.X炫酷新特性你都了解吗?
Python 标准库中最有用的装饰器
众所周知,Python 语言灵活、简洁,对程序员友好,但在性能上有点不太令人满意,这一点通过一个递归的求斐波那契额函数就可以说明:
somenzz
2021/11/04
3900
python模块之functools
functools模块提供了某些高阶函数(high-order function)。
枇杷李子橙橘柚
2019/05/26
6630
Python 标准库之 LRU 缓存实现学习
LRU (Least Recently Used) 是缓存置换策略中的一种常用的算法。当缓存队列已满时,新的元素加入队列时,需要从现有队列中移除一个元素,LRU 策略就是将最近最少被访问的元素移除,从而腾出空间给新的元素。
IT派
2018/07/30
1.2K0
Python 标准库之 LRU 缓存实现学习
10个鲜为人知的Python技巧,助你提升编程技能!
然而,在其广为人知的路径之外,隐藏着一些鲜为人知的技巧和技术,它们可以将你的Python编码技能提升到新的高度。
小F
2024/06/18
1630
10个鲜为人知的Python技巧,助你提升编程技能!
Python Functools
Functools 模块用于高阶函数: 作用于或返回其他函数的函数。一般来说,任何可调用对象都可以作为此模块的函数处理。
为为为什么
2023/10/17
2400
纯粹的python优化(数据结构、cache、推导、生成器)
在N篇文档中查找包含 X 单词的所有文档 [doc for doc in docs if 'X' in doc] 当N非常大的时候这样的效率是很低的
Michael阿明
2022/09/22
4720
纯粹的python优化(数据结构、cache、推导、生成器)
让Python程序轻松加速的方法
最近,我读了一篇有趣的文章,文中介绍了一些未充分使用的Python特性的。在文章中,作者提到,从Python 3.2开始,标准库附带了一个内置的装饰器 functools.lru_cache 。我发现这个装饰器很令人兴奋,有了它,我们有可能轻松地为许多应用程序加速。
博文视点Broadview
2020/06/12
1.1K0
让Python程序轻松加速的方法
Python性能提升大杀器:深入解析functools.lru_cache装饰器
在编写程序时,经常会遇到需要计算某个函数的输出,然后在稍后的代码中多次使用该输出的情况。
雷子
2024/02/06
4300
Python性能提升大杀器:深入解析functools.lru_cache装饰器
lru_cache和cache原理
LRU LRU (Least Recently Used) 是缓存置换策略中的一种常用的算法。当缓存队列已满时,新的元素加入队列时,需要从现有队列中移除一个元素,LRU 策略就是将最近最少被访问的元素移除,从而腾出空间给新的元素。
玖柒的小窝
2021/10/23
1K0
使用Python标准库functools中的lru_cache实现缓存
很简单,也很容易理解,但是不难发现这个函数在计算斐波那契数列的时候事实上进行了很多重复计算,例如:
杜逸先
2018/05/31
2.6K1
使用Python标准库functools中的lru_cache实现缓存
Python神器列传:函数神器functools模块全解析
作者:j_hao104 来源:见文末 functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们。 装饰器 partial 类是 functools 模块提供的主要工具, 它可以用来“包装”一个可调用的对象的默认参数。它产生的对象本身是可调用的,可以看作是原生函数。它所有的参数都与原来的相同,并且可以使用额外的位置参数或命名参数来调用。使用 partial 代替 lambda 来为函数提供默认参数,同时保留那些未指定的参数。 Partial 对象 下面列子是对 myfunc
小小科
2018/06/20
1K0
函数式编程模块(二)、functools模块
functools模块可以作用于所有的可以被调用的对象,包括函数 定义了__call__方法的类等
狼啸风云
2023/10/07
1790
lru_cache分析
在计算机软件领域,缓存(Cache)指的是将部分数据存储在内存中,以便下次能够更快地访问这些数据,这也是一个典型的用空间换时间的例子。一般用于缓存的内存空间是固定的,当有更多的数据需要缓存的时候,需要将已缓存的部分数据清除后再将新的缓存数据放进去。需要清除哪些数据,就涉及到了缓存置换的策略,LRU(Least Recently Used,最近最少使用)是很常见的一个,也是 Python 中提供的缓存置换策略。
Yerik
2021/08/22
6330
缓存淘汰算法与 python 中 lru_cache 装饰器的实现
此前的文章中,我们介绍过常见两种缓存架构 — 穿透型缓存与旁路型缓存。 常见缓存架构 — 穿透型缓存与旁路型缓存
用户3147702
2022/06/27
5500
缓存淘汰算法与 python 中 lru_cache 装饰器的实现
Python装饰器是个什么鬼?
所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。
MeteoAI
2019/07/30
8970
这10个Python性能调优的小技巧,你知道几个?
你好,我是 zhenguo 这是我的第479篇原创,这篇文章关于Python性能调优的10个小技巧,每天花5-10分钟阅读我的文章,对你技术提升一定会有帮助。
double
2021/11/25
4810
这10个Python性能调优的小技巧,你知道几个?
用functools.lru_cache实现Python的Memoization
用functools.lru_cache实现Python的Memoization 现在你已经看到了如何自己实现一个memoization函数,我会告诉你,你可以使用Python的functools.lru_cache装饰器来获得相同的结果,以增加方便性。 我最喜欢Python的原因之一就是它的语法的简洁和美丽与它的哲学的美丽和简单性并行不悖。Python被称作“内置电池(batteries included)”,这意味着Python捆绑了大量常用的库和模块,这些只需要一个import声明! 我发现funct
企鹅号小编
2018/01/19
1K0
如何写出高性能Python之缓存的应用?
  能看到这篇文章的同学,应该都对缓存这个概念不陌生,CPU中也有一级缓存、二级缓存和三级缓存的概念。缓存可以解决哪些问题?我们直接把网上的一段话放上来:
猫叔Rex
2021/01/29
5330
相关推荐
LeetCode 509. 斐波那契数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验