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 ...
随机推荐
- shell脚本一条命令直接发送http请求(xjl456852原创)
我们知道nc命令是一个网络工具.可以连接tcp/udp.也能模拟发送http请求. 现在介绍通过shell脚本,一条命令直接发送http请求. 命令如下,可以对下面的地址等信息自行修改: #!/bin ...
- pyqt tabliwdget表头属性修改
# -*- coding: utf-8 -*-__author__ = 'Administrator'import sysfrom PyQt4 import QtGui class MyWindow( ...
- [Redux] Passing the Store Down Implicitly via Context
We have to write a lot of boiler plate code to pass this chore down as a prop. But there is another ...
- Linux 时间同步配置(转)
一. 使用ntpdate 命令 1.1 服务器可链接外网时 # crontab -e 加入一行: */1 * * * * ntpdate 210.72.145.44 210.72.145.44 为中国 ...
- MVC笔记
简要论述对MVC模式的理解,并简述ThinkPHP中的MVC模式是如何运行的 MVC(Model-View-Controller)应用程序结构被用来分析分布式应用程序的特征.这种抽象结构能有助于将应用 ...
- (转)CSS 禁止浏览器滚动条的方法
1.完全隐藏 在里加入scroll="no",可隐藏滚动条: 这个我用的时候完全没效果,不知道是什么原因!不过好多人说这么用可以,大概是用的位置不一样吧 2.在不需要时隐 ...
- 读取并解析properties文件
public class SysConfig { private static final Properties properties = new Properties(); static{ Reso ...
- android Log.isLoggable步骤的使用
原文地址: http://www.cnblogs.com/maxinliang/p/4024442.html android Log.isLoggable方法的使用 android 动态控制logca ...
- iOS9适配+warning消除
最近做了iOS 9的适配,程序出现大量警告也做了些处理,写出来分先给大家. 一.iOS 9适配 问题一: <Error>: CGContextSaveGState: invalid con ...
- apache 反向代理配置(ubuntu)
1.配置apache2的站点文件 cd /etc/apache2/site-avaliable sudo vim edy.conf 具体配置如下: # 反向代理配置 # 监听所有80端口的访问 < ...