#微观剖析
'''
当找到速度很慢函数时,有时还需要做到测试某个部分函数剖析工作,这需要通过手动对一部分代码速度测试完成
'''
"""
import tempfile,os,pstats,cProfile
def p1(column='time',list1=5):
def _p1(function):
def __p1(*a,**k):
s=tempfile.mktemp()
p2=cProfile.Profile()
p2.runcall(function,*a,**k)
p2.dump_stats(s)
p=pstats.Stats(s)
p.sort_stats(column).print_stats(list1)
return __p1
return _p1
"""
import c
@c.p1()
def main1():
return c.p1()
main1()
"""
这种方法能够对应应用程序各部分进行测试, 使统计输出更加精确
但是这个阶段,被调用都的列表可能不太谁人有兴趣,因为函数已经被做为需要优化的部分,唯一令人有兴趣的是它让更快,然后改进它
timeit更行使这一需要,提供了一个简单的试题小型代码片断执行时间方法,它将宿主系统提供了的底层定时器(time.time或者time.clock),如下:
"""
import timeit
t=timeit.Timer('main()')
t.timeit(number=5)
"""
这个模块允许重复调用,适用于对忆隔离代码片断进行测试,在这 应用程序上下文之外非常有用
确定性剖析程序提供的结果依赖于运行它的电脑,因此每次生成结果都不一样,重复相同测试并且取其平均值能提供更精确的结果,而且有些电脑提供了特殊的cpu特性
,如speedsted,如果电脑在测试启动时处于闲置状态,也会改变结果,所以对于小的代码片断持续重复测试是一种良好的习惯
另外,不要忘记有各种缓存,如nds或cpu缓存.
"""
#另一种方法:装饰器
import time,sys
if sys.platform=='win32':
timer=time.clock
else:
timer=time.time
s={}
def d(name='start',start=s):
def _d(f):
def __d(*a,**k):
s1=timer()
try:
return f(*a,**k)
finally:
s1[name]=timer()-s1
return __d
return _d
#h1=d('this_func_is')(heavy)
#h1()
#print s['this_func_is']