python高级编程(第12章:优化学习)2
#优化策略
#3个原则
"""
1a:寻找其他原因:确定第三方服务器或资源不是问题所在
2a:度量硬件:确定资源足够用
3a:编写速度测试:创建带有速度要求的场景
"""
#看标题
#1a
"""
往往,性能问题都会出现实际过程中,客户会提醒软件在运行和测试环境中不一样,性能问题可能是因为应用程序没有考虑到现实世界中用户数或者数据量不断增长的情况
但是,如果应用程序存在与其他应用程序之间的交互,那么首先要做的是检查瓶颈是否出现这些交互,比如服务器可能带来额外的开销,变得速度很慢
应用程序之间的物理链接也应该考虑:可能应用程序服务器和其他企业内网中的服务器之间的网络链接因为错误配置而变的慢,或者一个多疑的防病毒软件对所有tcp包进行扫描而导致速度降低
设计文档应该提供一个描述所有交互和每个链接特性的一个图表,以获得对系统全面认识,并且在解决速度问题时提供帮助
如果应用程序使用了第三方服务器或者资源,那些应该评估每个交互,妈确定瓶颈不在那里
"""
#2a
"""
当内在不够用时,系统会使用硬盘来存储数据,也就是页面交换(swapping)
这样会带来额外的开销,性能将急剧下降,从用户角度来看,系统在这种情况下会被认为死机状态,所以2a能力以避免这样的情况出现
虽然系统上有足够的内存是很重要的,但是确保应用程序不要疯狂表演,并吞噬太多内在也是很重要的。
磁盘使用也很重要,如果代码中隐藏i/o错误,尝试重复写入磁盘,那么一个已满分区也可能降低应用程序速度,而且,即使代码只写入一次,硬件和系统也可能会尝试多次写入
扩展(Munin系统监控工具,用于获得系统健康情况),官方:http://munin.projects.linpro.no上可以找到
"""
#3a
"""
开始优化工作时,应该在测试程序上花工夫,而不是不断进行手工测试,一个好的做法是在应用程序上专门制作一个民,编写一系统针对优化的调用,这种方案可在应用程序中同时跟踪进度,可以编写一些断言,在这里设计一些速度要求,为了避免速度退化,这些测试可以留到代码被优化之后,如下:
"""
def the_code():
print 'hello world!'
import time as t
def test_speed():
s=t.time()
the_code()
end=t.time()-s
assert end<10,\
'sorry this code should not take 10 seconds!'
test_speed()
#度量硬件执行速度是取决于cpu运行能力
#3a
#需要3部分来完成
'''
剖析a:cpu/c:网络/b:内存使用情况
'''
#a
"""
确定性剖析程序通过在最低层上添加一个定时器来试题每个函数所花费的时间,这将一路平安一些开销,但是它是获取时间消耗信息一个好思路,另一方面,统计剖析程序将采样指令指针的使用情况而不采样代码,而后者比较不清爽,但是能够全速度运行目标程序
"""
#剖析代码2种方法
"""
x:宏观剖析:在使用同时剖析整个程序时,并生成统计
y:微观剖析:人工执行以试题程序中某个确定部分
"""
#y通过特殊模式下运行应用程序来完成,在这种模式下解释程序将收集代码使用情况统计信息,python提供以下几个工具
"""
*profile 一个纯python实现工具
* cprofile 以c实现,界面和profile相同,但开销更小
* hotshot 另一个c实现工具,可能会被标准程序库删除
"""
import p1
import cProfile
PROFILER=cProfile.Profile()
print PROFILER.runcall(p1.main)
PROFILER.print_stats()
print '*'*300
print cProfile.run('p1.main()','p1.s')
import pstats
pp=pstats.Stats('p1.s')
print pp.total_calls
pp.sort_stats('t').print_stats(3)
pp.print_callees('p1.m1')
"""
对输入进行排序,可以从不同的视力来查看瓶颈,如下
当调用数据确定很高,并且季很多时间,姥这个函数或者方法可能进行了一个循环,可以尝试对其他进行优化
当一个函数运行时间很长,如果可能,缓存可能是不错的选择
另一种从剖析数据显示瓶颈的好办法是将其转化为图表,使用gprof2dot工具(http://code.google.comm/p/jrfonseca/wiki/Gprof2Dot)就可以将剖析数据以菜点图形式展现,可以从http://jrfonseca.googlecode.com/svn/trunk/gprof2dot/gprof2dot.py下载这个脚本 ,然后使用它,只要安装了graphviz就可以了(http://www.graphviz.org)
kcachegrind也是一个很好的可视化显示剖析数据工作,参考http://kcachegrind.sourceforge.net/cgi-bin/show.cgi学习
宏观剖析对于发现有问题的函数,或者是与问题临近的函数而言主是很好的方法,当发现问题是,可以转用微观剖析
"""
python高级编程(第12章:优化学习)2的更多相关文章
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
- 第九章:Python高级编程-Python socket编程
第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...
- 第十一章:Python高级编程-协程和异步IO
第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程之选择好名称:完
由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...
- Python高级编程-Python一切皆对象
Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
随机推荐
- 【转】Devexpress使用之:GridControl控件(合并表头)
Devexpress系列控件功能很强大,使用起来也不太容易,我也是边摸索边使用,如果有时间我会把常用控件的使用方法整理出来的. using System; using System.Collectio ...
- Zedboard甲诊opencv图像处理(二)
通过前面的努力已经得到了n个轮廓了,现在要把最终的轮廓确定下来 ,然后进行特征提取. 先深入分析下轮廓和处理轮廓的方法:http://blog.csdn.net/hitwengqi/article/d ...
- My way on Linux - 知识梳理计划
知识梳理计划图 近期计划把自己学习的工作中用到的Linux知识梳理下,敬请期待.
- .NET开发人员必须知道的八个网站
对于不熟悉.NET技术的朋友,需要说明一下,.NET提供了一个平台和一些相应的工具,.NET开发人员可以使用它们来在开发Windows桌面,互联网,甚至是手持移动设备上构建极富交互性的应用.很有可能你 ...
- (转)Div+CSS布局入门
在网页制作中,有许多的术语,例如:CSS.HTML.DHTML.XHTML等等.在下面的文章中我们将会用到一些有关于HTML的基本知识,而在你学习这篇入门教程之前,请确定你已经具有了一定的HTML基础 ...
- 使用kindeditor 注意
ValidateRequest="false"引用编辑器要在最上端加入上面的话
- iOS 关于时间戳的一些细节
最近遇到一个bug,在iPhone上获取当前的时间戳,没有问题,而用iPad来测试的时候,出现了时间戳不对.当时的代码 (需要精确到毫秒,所以*1000) NSTimeInterval t = [[N ...
- UC浏览器 分享到朋友圈和微信好友
用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...
- 使用python发邮件
使用python发邮件 网上有很多发邮件的例子,本人在网上找了一份,稍加修改后使用 上源码 # encoding=utf-8 from email.mime.image import MIMEImag ...
- 慕课linux学习笔记(四)常用命令(1)
Root 表示当前登录用户 Localhost 主机名 ~ 当前所在位置(~表示/root) # 超级用户 $ 普通用户 命令 1.pwd 显示当前所在位置 2.ls 查询目录中的内容 -a 显示所有 ...