首页 > 代码库 > python高级编程(第12章:优化学习)2

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