Python: 使用装饰器“@”取得函数执行时间
Python中可以使用装饰器对函数进行装饰(或说包装),利用这个特性,可以很方便、简洁地解决一些问题,比如获得函数执行时间的问题。
首先,我们定义一个函数,如下:
def exeTime(func):
def newFunc(*args, **args2):
t0 = time.time()
print "@%s, {%s} start" % (time.strftime("%X", time.localtime()), func.__name__)
back = func(*args, **args2)
print "@%s, {%s} end" % (time.strftime("%X", time.localtime()), func.__name__)
print "@%.3fs taken for {%s}" % (time.time() - t0, func.__name__)
return back
return newFunc
当然,不要忘了“import time”导入time模块。这个函数就可以用作我们计算函数执行时间的修饰器了。
接下来,我们就可以在需要计时的函数前一行引用它作为装饰,比如:
@exeTime
def foo():
for i in xrange(10000000):
pass
注意最上方的“@exeTime ”,装饰器的语法以“@”开头,接着是装饰函数,在本例中为“exeTime”。这时,执行函数foo,装饰器就会在控制台打印出这个函数的执行时间了。
完整代码如下:
# -*- coding: utf-8 -*-
import time
# --exeTime
def exeTime(func):
def newFunc(*args, **args2):
t0 = time.time()
print "@%s, {%s} start" % (time.strftime("%X", time.localtime()), func.__name__)
back = func(*args, **args2)
print "@%s, {%s} end" % (time.strftime("%X", time.localtime()), func.__name__)
print "@%.3fs taken for {%s}" % (time.time() - t0, func.__name__)
return back
return newFunc
# --end of exeTime
@exeTime
def foo():
for i in xrange(10000000):
pass
if __name__ == "__main__":
foo()
在笔者电脑上的运行结果为:
@13:12:27, {foo} start
@13:12:27, {foo} end
@0.203s taken for {foo}
当然,上面只是一个很简单的示例,事实上,本例中的装饰器exeTime不仅可以装饰类似上面“foo”这样不带参数的函数,也能装饰带任意参数的函数,甚至还可以装饰类的方法,用法与上面是一样的。
除了计算运行时间外,装饰器还可以有很多用途,比如记录运行日志等,更多的用途等待更多的朋友去发掘。
相关文档:
filename=raw_input('enter file name:')
f=open(filename,'rb')
f.seek(0,0)
index=0
for i in range(0,16):
print "%3s" % hex(i) ,
print
for i in range(0,16):
print "%-3s" % "#" ,
print
while True:
temp=f.read(1)
if len(temp) == 0:
break
else:
print "%3s" % temp.encode('hex'),
......
代码中采用了三步实现算术表达式的解析:
1. 将算术表达式(字符串)转换成一个列表parseElement方法
2. 将列表表示的算术表达式转换成后缀表达式changeToSuffix
3. 计算后缀表达式的结果
这里我是为了方便, 就写了个parseElement, 不想那方法写到后面却把自己绕住了, 可以想象一个带自增, 位, 逻辑, 算术的表达式的数值提 ......
二进制文件下载地址:
SinaGetBook
效果如图:
代码:
#!/usr/bin/env python
#coding=utf-8
#!/usr/bin/env python
#coding=utf-8
import traceback
import sys
import wx
import re
import urllib
import wx.richtext as rt
import wx.lib.buttonpanel as bp
import Casing
import Debug
def trace_back ......
刚刚写完Python嵌入部分的简单例子(差不多够现在用的啦~),接着看点实际的东西,如果没有这些应用的话,前面的嵌入也没有什么意义。嵌入的其他部分以后遇到再写,不必一下子把那些函数都弄懂,是吧~
OK,来看Python库中我认为最好玩的一部分,也就是Python对网页的操作。
这篇简单说下如何通过网址下载网页,前提当然是 ......
最近在公司负责一个项目,是做一个编译器,大家可能知道,做编译器一般用C++或java,但是我的这个项目却使用了python来做这个编译器,很有挑战性。
我今天所讲的是在开发过程中,对使用python2.6语言的感受,目前这个项目已经完成三分之一了。
说实话,python并不适合做这样的项目。(虽然也能做)以下是总结了python相关 ......