前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何写出高性能Python之缓存的应用?

如何写出高性能Python之缓存的应用?

作者头像
猫叔Rex
发布2021-01-29 14:18:48
4920
发布2021-01-29 14:18:48
举报
文章被收录于专栏:科学计算科学计算

缓存有什么作用?

  能看到这篇文章的同学,应该都对缓存这个概念不陌生,CPU中也有一级缓存、二级缓存和三级缓存的概念。缓存可以解决哪些问题?我们直接把网上的一段话放上来:

  • 性能——将相应数据存储起来以避免数据的重复创建、处理和传输,可有效提高性能。比如将不改变的数据缓存起来,例如国家列表等,这样能明显提高web程序的反应速度;
  • 稳定性——同一个应用中,对同一数据、逻辑功能和用户界面的多次请求时经常发生的。当用户基数很大时,如果每次请求都进行处理,消耗的资源是很大的浪费,也同时造成系统的不稳定。例如,web应用中,对一些静态页面的呈现内容进行缓存能有效的节省资源,提高稳定性。而缓存数据也能降低对数据库的访问次数,降低数据库的负担和提高数据库的服务能力;
  • 可用性——有时,提供数据信息的服务可能会意外停止,如果使用了缓存技术,可以在一定时间内仍正常提供对最终用户的支持,提高了系统的可用性。

  所以这一节,我们就来讲一下Python中的缓存,怎么使用Python中的缓存功能,可以为程序提供多高的加速?本节课涉及的内容比较多,下面三个文章是基础:

Python嵌套函数 闭包

Python高性能计算之修饰符

如何写出高性能的Python之修饰符functools.wraps

functools.lru_cache()的应用

  Python的标准库中,包含了模块functools,这个模块主要用于高阶函数。lru_cache()是functools中的一个函数,它可以通过应用缓存来降低函数的执行时间。

lru_cache()的语法如下:

代码语言:javascript
复制
@lru_cache(maxsize=128, typed=False)

其中,maxsize表示缓存大小,也就是指定保留的元素个数;如果希望缓存区大小不受限制,可将这个参数设置为None。typed如果被设置为True,则不同类型的参数会被独立缓存,比如f(3)和f(3.0)就会被存储在两个独立的缓存中。

  缓存应用最直观的地方就是计算斐波那契数列,斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为兔子数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

  斐波那切数列的Python代码也比较简单:

代码语言:javascript
复制
def fibonacci(n):
    if n<1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

在ipython中,我们看一下计算fibonacci(20)所需要的时间:

代码语言:javascript
复制
%timeit fibonacci(20)
4.5 ms ± 166 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

需要4.5ms左右的时间才能计算完成,时间确实是比较长的了。但从代码中也可以看出来,由于没有重用之前计算的斐波那契数列,导致这种算法的时间复杂度大约为O(2^N).

在函数前使用修饰符lru_cache

代码语言:javascript
复制
@lru_cache(maxsize=128)
def fibonacci_cache(n):
    if n<1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

此时再看运行时间:

代码语言:javascript
复制
%timeit fibonacci_cache(20)
99 ns ± 7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

可以看到,时间缩短了45000倍,这个效率的提高是惊人的,也是非常可观的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 傅里叶的猫 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缓存有什么作用?
  • functools.lru_cache()的应用
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档