Python开发:缓存机制介绍

缓存是一种将定量数据加以保存以备迎合后续请求的处理方式,旨在加快数据的检索速度。在今天的文章中,我们将一同从简单示例出发,了解如何使用缓存机制。在此之后,我们将进一步利用Python标准库的functools模块创建适合自己需要的缓存。作为起步工作,我们首先创建一个类,用于构建我们的缓存字典,而后根据需要进行扩展。以下为具体代码:

在以上类示例中没有包含什么特别之处。我们只是创建一个简单类,同时设置两个类变量或者说属性,即cahce与max_cache_size。其中cache属于一套空字典,而max_cache_size显然代表着最大缓存容量。下面让我们进一步充实该代码,使其具备一定功能:

在这里,我们导入了datetime与random模块,而后我们即可看到之前创建完成的类。这一次,我们向其中添加几种方法。其中一种方法具备神奇的效果,名为_contains_。虽然在这里并不一定要使用该方法,但其基本思路在于允许我们检查该类实例,从而了解其中是否包含有我们正在寻找的键。另外,update方法负责利用新的键/值对进行缓存字典更新。一旦达到或者超出缓存最大容量,其还会删除日期最早的输入数据。另外,remove_oldest方法负责具体的字典内早期数据删除工作。最后,我们还引入了名为size的属性,其能够返回缓存的具体容量。

在添加了以下代码之后,我们就能够测试该缓存是否按预期起效:

在本示例当中,我们设置了大量预定义键与循环。如果键尚不存在,我们会将其添加到缓存当中。不过以上示例代码并没有提到如何更新访问日期,感兴趣的朋友们可以将其作为练习自行探索。在运行这段代码之后,大家会注意到当缓存被占满时,其会正确删除时间更早的条目。 现在,我们继续前进,看看如何利用另一种方式使用Python的内置functools模块创建缓存

使用functools.lru_cache

Python的functools模块提供一种非常实用的装饰器,即lru_cache。需要注意的是,其在3.2版本当中才被添加进来。根据说明文档所言,该装饰器能够“利用可调用内存对函数进行打包,从而削减最近调用的最大尺寸。”接下来,我们将根据说明文档中提到的示例编写一项基本功能,其中包含多个网络页面。在这种情况下,我们可以直接从Python说明文档站点处获取页面。

在以上代码当中,我们利用lru_cache对get_webpage函数进行了装饰,并将其最大尺寸设置为24条调用。在此之后,我们设置了一条网页字符串变量,并将其传递至我们希望函数获取的模块当中。根据我的个人经验,如果大家将其运行在某种Python解释器当中——例如IDLE——那么效果会更好。如此一来,我们就能够针对该函数运行多次循环。可以看到在首次运行上述代码时,输出结果的显示速度相对比较慢。但如果大家在同一会话中再次加以运行,那么其显示速度将极大加快——这意味着lru_cache已经正确对该调用进行了缓存处理。大家可以在自己的解释器实例当中进行试验并亲自查看结果。 另外,我们还可以将一条typed参数传递至该装饰器。其属于一条Boolean,旨在通知该装饰器在typed为设定为True时对不同类型参数进行分别缓存。

总结

现在大家已经初步了解了如何利用Python编写自己的缓存机制。这是一款有趣的工具,而且能够在各位面对大量高强度I/O调用或者希望对登录凭证等常用信息进行缓存时发挥重要作用。

原文发布于微信公众号 - CDA数据分析师(cdacdacda)

原文发表时间:2016-03-11

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

『腾讯后台开发』实习生技能要求

1462
来自专栏大史住在大前端

大前端的自动化工厂(3)—— babel

babel是ES6+语法的编译器,官方网址:www.babeljs.io,用于将旧版本浏览器无法识别的语法和特性转换成为ES5语法,使代码能够适用更多环境。

1863
来自专栏决胜机器学习

设计模式专题(九) ——外观模式

设计模式专题(九) ——外观模式 (原创内容,转载请注明来源,谢谢) 一、概述 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了...

35112
来自专栏大内老A

《WCF技术剖析》博文系列汇总[持续更新中]

近半年以来,一直忙于我的第一本WCF专著《WCF技术剖析(卷1)》的写作,一直无暇管理自己的Blog。在《WCF技术剖析(卷1)》写作期间,对WCF又有了新的感...

1748
来自专栏枕边书

解决问题,别扩展问题

最近有个需求需要统计一个方法的耗时,这个方法前后各打出一条日志,类似于 [INFO] 20180913 19:24:01.442 method start/en...

721
来自专栏Pulsar-V

PHP微信开发入门(二)

微信服务器消息推送 微信的消息推送方式是客户操作微信发生一系列事件,然后腾讯微信服务器发送一个XML数据POST请求把事件描述发送到你填写的服务器URL上,你的...

3866
来自专栏开发与安全

套接字socket 的地址族和类型、工作原理、创建过程

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为...

26011
来自专栏ytkah

finecms栏目文章页seo设置

  finecms栏目页和文章页默认的标题是页面title_二级栏目title_一级栏目title_网站名称(比如:finecms怎么设置标题_finecms二...

2826
来自专栏JAVA高级架构

深入理解Java虚拟机到底是什么

什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕...

3037
来自专栏微信公众号:Java团长

深入理解Java虚拟机到底是什么

作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了。...

1453

扫码关注云+社区