Python中统计函数的运行耗时

源地址:http://www.cnblogs.com/tuzkee/archive/2013/02/21/2920902.html

import time

def time_me(fn):
    def _wrapper(*args, **kwargs):
        start = time.clock()
        fn(*args, **kwargs)
        print "%s cost %s second"%(fn.__name__, time.clock() - start)
    return _wrapper



#这个装饰器可以在方便地统计函数运行的耗时。用来分析脚本的性能是最好不过了。
#这样用:
@time_me
def test(x, y):
    time.sleep(0.1)

@time_me
def test2(x):
    time.sleep(0.2)

test(1, 2)
test2(2)

#输出:
#test cost 0.1001529524 second
#test2 cost 0.199968431742 second

另一个更高级一点的版本是:

import time
import functools

def time_me(info="used"):
    def _time_me(fn):
        @functools.wraps(fn)
        def _wrapper(*args, **kwargs):
            start = time.clock()
            fn(*args, **kwargs)
            print "%s %s %s"%(fn.__name__, info, time.clock() - start), "second"
        return _wrapper
    return _time_me

@time_me()
def test(x, y):
    time.sleep(0.1)

@time_me("cost")
def test2(x):
    time.sleep(0.2)

test(1, 2)
test2(2)

#输出:
#test used 0.0999263791237 second
#test2 cost 0.199644784554 second

高级版本相比第一个版本多了一个自带的参数。

上例中@修饰符的作用:

‘@’符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。也就是说@A def f(): 是非法的。 只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。

  本质上讲,装饰符@类似于回调函数,把其它的函数(暂且称为目的参数)作为自己的入参,在目的函数执行前,执行一些自己的操作,比如:计数、打印一些提示信息等,然后返回目的函数。

因此,第一个版本就相当于执行:

time_me(test())
time_me(test2())

高级版本相当于执行:

time_me("info")(test())
time_me("cost")(test2())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值