首先,先看一下,未使用装饰器时,我们想查看代码的执行时间如何操作?
import time
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2,num+1):
if num%i == 0:
return True
return True
def prime_nums():
time1 = time.time()
for i in range(2,10000):
if is_prime(i):
print(i)
time2 = time.time()
print(time2 - time1)
prime_nums()
从上面的代码可以看出,想要知道函数的执行时间,最简单的方式是在原函数内进行修改。然而我们想在不改动原函数的情况下,进行代码的执行时长的打印,此时 装饰器就该闪亮登场了。(在源代码上进行修改,既包含逻辑又包含计时,会降低代码的可读性)
装饰器说白了 ,也是一个函数,装饰器的参数是另外一个函数
日常主要使用的有两种:
1.无参编辑器
import time
def display_time(func):
def wrapper():#wrapper()括号内无参数
time1 = time.time()
func()
time2 = time.time()
print(time2 - time1)
# return result
return wrapper
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2,num+1):
if num%i == 0:
return True
return True
@display_time
def prime_nums():
for i in range(2,10000):
if is_prime(i):
print(i)
prime_nums()
运行prime_nums()时,会跳到装饰器内(@display_time),然后运行wrapper函数的内容,首先计一个时间t1,然后才会执行prime_nums(),然后再计一个时间t2,
2.有参装饰器(参数个数未知,可在wrapper内使用 *args)
import time
def display_time(func):
def wrapper(*args,**kwargs):
time1 = time.time()
result = func(*args,**kwargs)
time2 = time.time()
print("Total time:{:.4}s".format(time2 - time1))
return result
return wrapper
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2,num):
if num % i == 0:
return False
return True
@display_time
def count_prime_nums(maxnum):
count = 0
for i in range(2,maxnum+1):
if is_prime(i):
# print(i)
count = count + 1
return count
count = count_prime_nums(10000)
print (count)