#优化策略

#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的更多相关文章

  1. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

  2. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  3. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  4. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  5. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  6. python高级编程之选择好名称:完

    由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...

  7. Python高级编程-Python一切皆对象

    Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...

  8. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  9. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  10. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

随机推荐

  1. AngularJs学习笔记4——四大特性之双向数据绑定

    双向数据绑定 方向1:模型数据(model)绑定到视图(view) 实现方法:①.{{model变量名}}  ②.常用指令(ng-repeat) 方向2:将视图(view)中用户输入的数据绑定到模型数 ...

  2. laravel-模板引擎Blade

    (慕课网_轻松学会Laravel-基础篇_天秤vs永恒老师) 一.概述 Blade是Laravel提供的一个既简单又强大的模板引擎 和其他流行的PHP模板引擎不一样,Blade并不限制你在视图view ...

  3. C++11中正則表達式測试

    VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...

  4. Android Action Bar 详解篇 .

    作者原创,转载请标明出处:http://blog.csdn.net/yuxlong2010 作为Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器.它可以作为活 ...

  5. Android调用系统邮件类应用的正确实现方法

    Android应用开发中,很多情况下免不了要调用手机上的邮件类应用,实现邮件发送的功能,这一般是通过调用系统已有的Intent来实现的.看到网上很多邮件发送都是调用action为android.con ...

  6. gulp 构建工具

    1. gulp 的简介 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以 ...

  7. c#基础: NetWorkStream类的主要属性

    一.网络流 1.    最常用的方法  Read()  Write()    Flush() NetworkStream netStream = new NetworkStream(mesock); ...

  8. XML基本知识

    一.xml简介 1.xml(可扩展标记语言),是一种标记语言,类似于html,其作用主要是传输数据,并非显示数据! 2.xml标签没有被预定义需要用户自行定义. 3.xml由w3c组织发布,遵循200 ...

  9. SuperSocket学习笔记(二)

    上一篇博客SuperSocket学习笔记(一)说明了怎么快速搭建一个服务器端,这篇文章我想深挖一下SuperSocket 1. 每一个客户端连接到服务器端时,服务器端会将客户端的信息保存到一个Sess ...

  10. Property与Attribute的区别

    Property属于面向对象的范畴----属性 Attribute则是编程语言文法层面的东西----特征          Property属于面向对象的范畴.在使用面向对象编程的时候,常常需要对客观 ...