我们在上一篇文章(Python实例来认识并发与并行)中用到了 @timer ,在函数定义时,加上一个小小的 @timer ,这样,函数执行结束后,就会自动在控制台汇报自己运行的时间。
成都创新互联公司长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为宁县企业提供专业的成都网站制作、成都网站建设、外贸营销网站建设,宁县网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
比如下面这样:
- @timer
- def piper():
- for i in range(10000):
- i = i * i ** 10
- piper()
- 输出:
- timer: using 0.00600 s
实际上,这个计时器逻辑 @timer 是我们自己用 Python 中的修饰器特性[1]来实现的。
其实我们不用修饰器,自己也能实现计时的逻辑。
- def piper():
- for i in range(10000):
- i = i * i ** 10
- t = time.time() # 记录函数开始时时间
- piper()
- print(f"timer: using {time.time() - t :.5f} s") # 获取函数运行时间并打印
注意到我们执行函数时,在其上下都包裹上了逻辑。如果我们希望函数自带计时逻辑,那么为了包住原函数,只能去新定义一个函数。
- def time_wrapper(func):
- # func 是一个函数
- t = time.time()
- func()
- print(f"timer: using {time.time() - t :.5f} s")
- time_wrapper(piper)
- 输出:
- timer: using 0.00600 s
我们想测试某一个函数运行时间时,将函数名输入到 time_wrapper 里面就好。
上述代码显然有缺点:
于是我们请出今天的主角 修饰器@wraps[2] 。
还用我们的 timer 举例子,我们让所有在 @timer 下的函数,都经过如下处理:
- def timer(func):
- @wraps(func)
- def inner_func():
- t = time.time()
- rts = func()
- print(f"timer: using {time.time() - t :.5f} s")
- return rts
- return inner_func
以 piper 为例,我们经历了如下变化。
- @timer
- def 原始piper():
- for i in range(10000):
- i = i * i ** 10
实际上,当你再调用 piper 时,你的 piper 内部逻辑早已变为:
- def 当前piper():
- t = time.time()
- rts = 原始piper()
- print(f"timer: using {time.time() - t :.5f} s")
- return rts
本文简单与读者朋友们「科普」一下修饰器,注意到我们这里实际上仅仅修饰了无参数的函数。其实,修饰器还有许多更加优雅用途,比如传入参数 *args, **kwargs ,修饰类 __call__ 等用法。期待以后我遇到好的应用场景,将经验分享给朋友们。
分享名称:@wraps修饰器:让你的Python代码更加简短可爱|从简单实例来认识它
URL网址:http://www.shufengxianlan.com/qtweb/news42/56492.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联