专栏首页科学计算如何写出高性能Python之缓存的应用?

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

缓存有什么作用?

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

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

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

Python嵌套函数 闭包

Python高性能计算之修饰符

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

functools.lru_cache()的应用

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

lru_cache()的语法如下:

@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代码也比较简单:

def fibonacci(n):
    if n<1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

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

%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

@lru_cache(maxsize=128)
def fibonacci_cache(n):
    if n<1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

此时再看运行时间:

%timeit fibonacci_cache(20)
99 ns ± 7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

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

本文分享自微信公众号 - 科学计算technomania(Quant_Times),作者:张大侠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-01-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 13 如何写出高性能的Julia

    全局变量的值和类型随时都会发生变化。 这使编译器难以优化使用全局变量的代码。 变量应该是局部的,或者尽可能作为参数传递给函数。

    猫叔Rex
  • 如何打造高性能的 Go 缓存库

    我在看一些优秀的开源库的时候看到一个有意思的缓存库 fastcache,在它的介绍主要有以下几点特点:

    luozhiyun
  • 高级Python技术:如何在Python应用程序中实现缓存

    简而言之,缓存的概念主要是利用编程技术将数据存储在临时位置,而不是每次都从源检索数据。

    HuangWeiAI
  • 教你如何写出高性能的Mybatis分页插件

    最近做的一个需求需要写复杂的SQL,且需要分页,我是非常懒的人,因为项目中使用了mybatis-plus,因此分页想着使用mybatis-plus的分页插件自动...

    Java艺术
  • 如何设计出高可用、高性能的接口

    当我们设计接口,我们或多或少都会有上面列举的一些考虑,我们只有想的更多才能让让我们的接口更加完善,我个人觉得100%完美的接口是不存在,只有适合才是最重要。

    IT小马哥
  • 如何提高Flutter应用程序的性能

    在调用 setState() 方法重建组件时,一定要最小化重建组件,没有变化的组件不要重建,看下面的Demo,这是一个设置页面,

    老孟Flutter
  • 高性能PHP应用需遵循的20条法则[1]|缓存命中率

    小知识:在redis中可以运行info命令查看redis服务的状态信息,其中keyspace_hits为总的命中中次数,keyspace_misses为总的mi...

    猿哥
  • Kafka源码系列之kafka如何实现高性能读写的

    本文依然是以kafka 0.8.2.2的源码为例进行讲解。 一,kafka高性能的原因 Kafka吞吐量是大家公认的高,那么这是为什么呢?个人总结为以下三点: ...

    Spark学习技巧
  • 如何利用CPU Cache写出高性能代码,看这些图就够了!

    我们平时编写的代码最后都会交给CPU来执行,如何能巧妙利用CPU写出性能比较高的代码呢?看完这篇文章您可能会有所收获。

    GorgonMeducer 傻孩子
  • 作为一个Python爱好者,如何写出高可读性的代码?

    推荐导读:Python的初学者,开发者都应该知道的代码可读性提高技巧,本篇主要介绍了如下内容:

    Python数据科学
  • 如何使用python搭建一个高性能的网站

    作为一名程序员,还是必须要会开发网站的,不然别人都会怀疑你是不是程序员了。今天,主要介绍一下如何使用python来搭建一个网站。可能有人会觉得搭建网站不都应该用...

    py3study
  • .NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Memory(三)

    我们都知道,.Net Core是微软推出的一个通用开发平台,它是跨平台和开源的,由一个.NET运行时、一组可重用的框架库、一组SDK工具和语言编译器组成,旨在让...

    justmine
  • .NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的秉性特点(二)。

    读完上篇《通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。》,相信大家对span的本质应该非常清楚了。含着金钥匙出生的它,从小就被寄予厚...

    justmine
  • .NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

    如果能很好地回答这几个问题,那么就能很好地理解今天了主题了。C#构建了一个托管世界,在这个世界里,只要不写不安全代码,不操作指针,那么就能获得.Net至关重要的...

    justmine
  • 加速!缓存Python函数的运行结果:Memoization

    使用称为“memoization”的强大而方便的缓存技术来加速您的Python程序。 在这篇文章中,我将向您介绍一种方便的方法来加速你的Python代码,该技术...

    企鹅号小编
  • Python和SQL Server 2017的强大功能

    Woodson
  • Django的设计哲学

    Django 读作姜戈,第一个 D 不发音,与电影《被解救的姜戈》的姜戈除了读音一样,没有其他半毛钱关系。Django 是一个优秀的 Web 框架,用 Pyth...

    somenzz
  • Streamlit,这是专为ML工程师打造的应用程序框架

    每个不平凡的机器学习项目最终都将使用漏洞缠身且无法维护的内部工具进行缝合。这些工具(通常是Jupyter笔记本和Flask应用程序的拼凑而成)难以部署,需要对客...

    代码医生工作室
  • 遗传算法框架GAFT优化小记

    專 欄 ❈PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,...

    Python中文社区

扫码关注云+社区

领取腾讯云代金券