python | 手写一个python代码计时器,分别基于装饰器和上下文管理器两种方案实现


01 传统方案

我们在编码的时候常常有函数计时的需求,通常都是直接使用python自带的time库来实现。

import time

t0 = time.time()
...  # 要计时的代码
elapsed = time.time() - t0
print(f"耗时{elapsed}s")

这种方式显然不够优雅。

02 使用函数装饰器

装饰器很适合用于给函数计时,只需要在函数定义时,函数的上方使用装饰器,就能实现对函数的计时,随用随写。

import time
from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
		t0 = time.time()
        result = func(*args, **kwargs)
        elapsed = time.time() - t0
        print(f"耗时{elapsed}s")
        return result
    return wrapper

使用时:

@timer
def do_something():
	...

do_something()  # 执行函数时自动执行装饰器中代码 显示该函数的耗时

03 使用上下文管理器

装饰器的好处是对函数本身的代码无侵入,但仅适用于函数的情形,而且如果一个函数上已经有其他装饰器,再叠加装饰器可能会有潜在的问题。此时的另一种方案是使用上下文管理器,配合with关键字实现计时功能。

创建一个用于计时的上下文管理器:

import time

class Timer:
	# 该函数在进入上下文管理时执行
    def __enter__(self):
        self.start = time.time()
        return self

	# 该函数在结束上下文管理时执行
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end = time.time()
        self.interval = self.end - self.start  # 记录了上下文执行的耗时

    def __str__(self):
        return str(self.interval)

    @property  # 该装饰器使得该方法能像作为属性被调用
    def str(self):
        return self.__str__()

使用时:

with Timer() as elapsed:
    ...  # 要计时的代码
print(f"耗时{elapsed}s")
# 或者使用.str
print(elapsed.str)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿林仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值