前言

本来我一直不知道怎么来更好地优化网页的性能,然后最近做python和php同类网页渲染速度比较时,意外地发现一个好方法:直接像某些php应用比如Discuz论坛那样,在生成的网页中打印出“本页面生成时间多少多少秒”,然后在不停地访问网页测试时,很直观地就能发现什么操作会导致瓶颈,怎样来解决瓶颈了。

于是我发现SimpleCD在生成首页时,意外地竟然需要0.2秒左右,真真不能忍:对比Discuz论坛首页平均生成才0.02秒,而Discuz论坛的首页页面无疑比SimpleCD的主页要复杂不少;这让我情何以堪啊,因为这必然不是Python语言导致的差距,只能说是我完全没做优化而Discuz程序优化得很好的后果。

======================================================

这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。小编这里推荐加小编的python学习群:895,817, 687

======================================================

优化分析

其实不用分析也能知道肯定是数据库在拖累,SimpleCD在生成首页时需要在sqlite的三个数据库中进行42多次查询,是历史原因导致的极其低效的一个设计;但是这40多次查询中,其实大部分是非常快的查询,仔细分析一下就有两个是性能大户,其他都不慢。

第一个大户就是:获取数据个数

SELECT count(*) FROM verycd

这个操作每次都要花不少时间,这是因为每次数据库都要锁住然后遍历一遍主键统计个数的缘故,数据量越大耗时就越大,耗时为O(N),N为数据库大小;实际上解决这个问题非常容易,只要随便在哪存一个当前数据的个数,只有在增删数据的时候改动就行了,这样时间就是O(1)的了

第二个大户就是:获取最新更新的20个数据列表

SELECT verycdid,title,brief,updtime FROM verycd ORDER BY updtime DESC
LIMIT 20;

因为在updtime上面做了索引,所以其实真正查询时间也就是搜索索引的时间而已。然则为什么这个操作会慢呢?因为我的数据是按照publish time插入的,按update time进行显示的话就肯定需要在至少20个不同的地方做I/O,这么一来就慢了。解决的方法就是让它在一个地方做I/O。也就是,除非数据库加入新数据/改变原有数据,否则把这条语句的返回结果缓存起来。这么一来又快了20倍:)

接下来的是20条小case:取得发布人和点击数信息

SELECT owner FROM LOCK WHERE id=XXXX;
SELECT hits FROM stat WHERE id=XXXX;

这里为什么没用sql的join语句来省点事呢?因为架构原因这些数据放在不同的数据库里,stat是点击率一类的数据库,因为需要频繁的插入所以用mysql存储;而lock和verycd是需要大量select操作的数据库,因为mysql悲剧的索引使用情况和分页效率而存放在了sqlite3数据库,所以无法join -.-

总之这也不是问题,跟刚才的解决方法一样,统统缓存

所以纵观我这个例子,优化网页性能可以一言以蔽之,缓存数据库查询,即可。我相信大部分网页应用都是这样:)

Memcached终于出场

终于轮到memcached了,既然打算缓存,用文件做缓存的话还是有磁盘I/O,不如直接缓存到内存里面,内存I/O可就快多了。于是memcached顾名思义就是这么个东东。

memcached是很强大的工具,因为它可以支持分布式的共享内存缓存,大站都用它,对小站点来说,只要出得起内存,这也是好东西;首页所需要的内存缓冲区大小估计不会超过10K,更何况我现在也是内存土豪了,还在乎这个?

安装:略

配置运行:因为是单机没啥好配的,改改内存和端口就行了

vi /etc/memcached.conf
/etc/init.d/memcached restart

在python的网页应用中使用之

import memcache
mc = memcache.Client([‘127.0.0.1:11211’], debug=0)

memcache其实就是一个map结构,最常使用的就是两个函数了:

第一个就是set(key,value,timeout),这个很简单就是把key映射到value,timeout指的是什么时候这个映射失效
第二个就是get(key)函数,返回key所指向的value

于是对一个正常的sql查询可以这么干


其中md5是为了让key分布更均匀,其他代码很直观我就不解释了。

优化结果和结论

优化过语句1和语句2后,首页的平均生成时间已经降低到0.02秒,和discuz一个量级了;再经过语句3的优化,最终结果是首页生成时间降低到了0.006秒左右,经过memcached寥寥几行代码的优化,性能提高了3300%。终于可以挺直腰板来看Discuz了:)

说memcached是妖孽,并不是因为memcached应用了之后性能狂升——这本是意料之中的事情,不这样反而才奇怪——而是因为我基本上没花多少时间就实现了这么妖孽的效果,至少我花的时间并不比写这篇blog的时间多。那么方便的使用方法和那么显著的性能提升状况真是让人咋舌。

30分钟3300%性能提升—python+memcached网页优化小记相关推荐

  1. 远场语音识别,性能提升 30%,百度怎么做到的?

    导语:彻底端到端 ~ "今天我保守报一个30%以上的性能提升,很保守.未来这个技术会再次大幅刷新人们对远场语音的认知.我自己的判断是,三年以内远场语音技术的识别率将达到近场识别率,因为有了这 ...

  2. 努比亚Z11系统服务器选择,良心!努比亚Z11系列机型系统升级新版本后性能提升明显...

    IT之家1月18日消息 随着科技的快速发展,智能手机的更新换代也变得越来越快,刚买的手机没过多久就变成了老款.而在对老款机型的系统更新方面,各家厂商又有着不同的态度.这也使得人们在选择新机的时候更加谨 ...

  3. 适合上班族做自媒体的6款工具,每天坚持30分钟,收益多多

    现在身边越来越多人靠做自媒体实现了自由,甚至连读大学的表妹都靠这个养活了自己! 所以真的非常建议大家在下班或空闲时间运营自媒体,不仅能提升技能,还能为自己多赢得一份收入. 今天就来跟大家分享6款最适合 ...

  4. Web的现状:网页性能提升指南

    互联网发展非常迅速,所以我们创造了Web平台.通常 我们会忽视连通性等问题,但用户们却不会视而不见 .一瞥万维网的现状,可以发现我们并没有用同情心.变通意识去构建它,更不要说性能了. 所以,今天的We ...

  5. 百倍加速!Python量化策略的算法性能提升指南

    性能问题 Python在2016年里可以说是风靡国内量化投资圈,目前整个生态链已经初具规模: 交易:vn.py.easytrader.at_py 数据:tushare 回测:rqalpha 在线平台: ...

  6. 百倍加速:Python量化策略的算法性能提升指南

    性能问题 Python在2016年里可以说是风靡国内量化投资圈,目前整个生态链已经初具规模: 交易:vn.py.easytrader.at_py 数据:tushare 回测:rqalpha 在线平台: ...

  7. 30分钟 Python 教程

    Python 教程 本教程以最简单的方式力求全面介绍常用和常见python语法及相关特性. 本教程适用于有一定的编程(C/C++/Java/C#/js等)基础的人员. 作者-dwSun Python介 ...

  8. Web 的现状 :网页性能提升指南

    技术人员经常会发现自己处于特权状态.随着最新的高端笔记本电脑.手机和快速有线互联网连接 ,很容易让我们忘记 ,这些并不是每个人都有的条件 (实际上 ,真的很少 ). 如果我们从特权和缺乏同情的角度来构 ...

  9. python在财务上的应用-财会人必看:这个工具,30分钟可以把人家一天的工作都给干完!...

    原标题:财会人必看:这个工具,30分钟可以把人家一天的工作都给干完! 每年3月到6月,工商年报.汇算清缴交织在一起,财务总是被安排得明明白白的.尤其今年还有首次个人所得税汇算清缴! 作为一个财务,除了 ...

最新文章

  1. 【收藏】银联在线支付商户UPMP接口的使用和说明
  2. 解决xe7无法找到system.pas的问题
  3. mac 搭建php wamp,Linux,Windows,Mac平台php环境配置
  4. 办公技巧:Excel下拉菜单小技巧,赶紧学一下!
  5. 二元置信椭圆r语言_医学统计与R语言:圆形树状图(circular dendrogram)
  6. 第八十九期:还在手动盖楼领喵币?双十一这群开发者竟然如此「作弊」
  7. Shell字符串操作集合
  8. 弹性理论法研究桩基受力计算公式_竖向荷载下群桩的承载力分析
  9. 设计素材PSD分层模板|美食类海报设计技法
  10. MySQL安装过程中出现的vcruntime140.dll缺失
  11. 数据结构——单向循环链表双向循环链表
  12. odin学习2 button
  13. 如何进行敌我识别(IFF)应用中的二次监视雷达(SSR)的模块化产线测试
  14. layui 省市区 三级联动 单选
  15. KEGG Brite 数据库
  16. 贪吃蛇java游戏代码_java实现贪吃蛇游戏代码(附完整源码)
  17. python自动点赞软件_python requests 简单实现易班登录,自动点赞,评论,发表
  18. web自动化断言_无需断言即可进行Web开发的自动化测试
  19. 数字平原CG场景搭建制作流程解析
  20. 小米盒子,一个说皇帝没穿衣服的小孩

热门文章

  1. springmvc多个视图解析器管理跳转资源
  2. HttpClient在传参和返回结果的中文乱码问题
  3. Spring框架设计
  4. python获取网页源码不完整_python和Ajax在一起了?真的???
  5. 以太坊怎么注册_以太坊2.0将至,牛市即将到来??
  6. 高精度计算(High-Precision_Calculation)
  7. 【笔记】springboot+spring security登录流程实现
  8. WEBMIN里添加VSFTP控制模块
  9. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】
  10. MySql 常用命令总结