#优化策略

#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. python标准库之字符编码详解

    codesc官方地址:https://docs.python.org/2/library/codecs.html 相关帮助:http://www.cnblogs.com/huxi/archive/20 ...

  2. Javascript:字符串分割split()妙用

    概述: split() 方法将字符串分割为字符串数组,并返回此数组 语法格式: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...

  3. Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

    这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用操心.这太简单了~! 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www ...

  4. LG 2.2.1 P350安卓系统刷机,问题总结,希望对需要的朋友有助

    手机误删软件导致短信,键盘等无声音提醒 我的手机前几天被我误删了一个软件,导致电话接不了,别人打电话的时候,老提示我在通话中,但是我可以在通话中看到对方的打电话记录.短信,键盘,USB连接,等等都没有 ...

  5. [RxJS] Error Handling in RxJS

    Get your code back on the happy path! This lesson covers a variety of ways to handle exceptions thro ...

  6. exec与xargs区别

    区别描述: 两者都是对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令. -exec:{}表示命令的参数即为所找到的文件,以:表示comman命令的结束.\是转义符,因为分号在 ...

  7. 单例模式(Singleton)详解——转载

    单例模式(Singleton) 首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过 ...

  8. C# 标签打印示例 1

    初次写博客,有哪些不足的地方,还请多多指点,给予建议,谢谢! 如若想要源码,请留言.        本实例是在Webservice 中通过excel做模板来打印标签.具体需求是:一个订单一页纸打印4行 ...

  9. 软件工程师所需掌握的“终极技术”是什么?

    软件工程师所需掌握的"终极技术"是什么? http://yunli.blog.51cto.com/831344/1019990 最近,我在微博上看到@程序员邹欣老师发的一条微博 - ...

  10. oracle登录错误(ORA-01033:ORACLE initialization or shutdown in progress

    在网上查找出现这种错误的原因一般是因为删除数据库 安装文件下的某个文件造 成的, 但是在我们的服务器上是因为 机子重启(意外断电)了一下就造 成这样的错误,不过解决办法是一样的,下面贴上解决方案 解决 ...