码迷,mamicode.com
首页 > 编程语言 > 详细

python高级编程(第12章:优化学习)3

时间:2014-10-05 18:48:48      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   os   ar   for   sp   2014   

#微观剖析

‘‘‘

当找到速度很慢函数时,有时还需要做到测试某个部分函数剖析工作,这需要通过手动对一部分代码速度测试完成

 

‘‘‘

bubuko.com,布布扣

"""

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,如果电脑在测试启动时处于闲置状态,也会改变结果,所以对于小的代码片断持续重复测试是一种良好的习惯

另外,不要忘记有各种缓存,如ndscpu缓存.

"""

 

#另一种方法:装饰器

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‘]

python高级编程(第12章:优化学习)3

标签:style   blog   http   io   os   ar   for   sp   2014   

原文地址:http://www.cnblogs.com/mhxy13867806343/p/4007177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!