首页 / 缓存 / Python:防止缓存使我减速
Python:防止缓存使我减速
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:防止缓存使我减速,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1936字,纯文字阅读大概需要3分钟。
内容图文
我正在使用具有非常积极的缓存功能的Web应用程序. Web应用程序的几乎每个组件:视图,局部视图,控制器输出,磁盘负载,REST-API调用,数据库查询.可以使用任何装饰器来缓存所有级别可以缓存的所有内容.
自然,这是飞快的发展,因为绝大多数HTML代都包含纯函数,而磁盘/ REST API的负载却很少.此外,我执行的少量磁盘加载/数据库查询/ REST API查询也会被缓存,直到无效为止,因此,除非进行了某些更改,否则它们的速度也很快.
因此,一切进展很快,但有一个麻烦:所有这些东西都被缓存在内存中,即我的WSGI进程中的一个巨大的全局字典中,因此可以直接存储而无需序列化.一旦我开始将内容放入memcached中,缓存命中所花费的时间不会改变太多,但是将内容放入缓存中的时间会更长.总的来说,这是可以的,但是每个页面的初始“填充缓存”生成时间约为900毫秒(考虑到从磁盘读取的平面文件的数量,这一速度已经相当快)(约900毫秒).作为参考,一旦预热缓存,生成任意页大约需要10毫秒.
对代码进行性能分析,绝大多数时间将花费在cPickle上.所以问题是,我怎样才能使它更快?是否有任何内存缓存可以直接将我的对象传递给它们而无需序列化?或者采取某种方法来加快对大量对象的缓存?我可能没有持久性的内存缓存,但是我的表现(或缺乏表现)将由Apache / WSGI流程管理器来进行.
解决方法:
如果要序列化Python对象而不是简单的数据类型,并且必须使用pickle,请尝试cPickle.HIGHEST_PROTOCOL:
my_serialized_object = cPickle.dumps(my_object, cPickle.HIGHEST_PROTOCOL)
默认协议与旧版本的Python兼容,但是您可能对此并不在意.
我只是做了一个简单的基准测试,并带有1000个键的字典,这几乎快了一个数量级.
更新:由于您似乎已经在使用最高协议,因此您将不得不做一些额外的工作才能获得更高的性能.这是我此时要执行的操作:
>确定哪些课程是最慢的
>在类中创建一对方法以实现更快的序列化方法,例如_to_string()和_from_string(s).可以根据对象包含的内容以及如何使用它来定制实际的序列化.例如,某些对象实际上可能只包含一个简单的字符串(例如渲染的模板),而某些实际上可能以JSON的形式发送到浏览器,在这种情况下,您可以简单地序列化为JSON并直接提供服务.使用timeit module来确保您的方法实际上更快
>在装饰器中,检查hasattr(object,’_to_string’),并使用它(如果存在)
此方法使您可以首先解决最差的类,并最小化对代码库的破坏.
内容总结
以上是互联网集市为您收集整理的Python:防止缓存使我减速全部内容,希望文章能够帮你解决Python:防止缓存使我减速所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。