编程教育资源分享平台

网站首页 > 后端开发 正文

Python面试必背——实现一个装饰器记录函数的执行时间,附代码

luoriw 2024-02-01 14:24:13 后端开发 12 ℃ 0 评论

一个常见的Python面试题:请实现一个装饰器,可以记录一个函数的执行时间。

下面的示例代码中的这个装饰器使用了time.time()来获取函数执行前后的时间戳,计算出执行时间,并打印出来。同时使用了functools.wraps来保留原函数的元信息。

装饰器的作用是在不修改原函数的情况下,给其添加额外功能。这里的额外功能是计算运行时间。

这个例子演示了如何实现一个简单但有用的装饰器,记录函数执行时间是一个常见的需求,可以助于代码性能优化。

import time
import functools

def timeit(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__} executed in {end - start:.4f}s')
        return result
    return wrapper

@timeit
def calc_square(numbers):
    result = []
    for n in numbers:
        result.append(n*n)
    return result

calc_square([1,2,3,4,5])


附加知识点:详细介绍下Python装饰器的语法,为什么Python会开发装饰器这种语法?其他语言有没有类似的语法?

Python装饰器的语法如下:

@decorator
def func():
    pass

这里的@decorator表示使用decorator这个装饰器来装饰func函数。

装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个函数。例如:

def decorator(func):
    # 在这里对func做一些处理
    return wrapper

@decorator
def func():
    pass

当使用@decorator语法时,它会将被装饰的函数func作为参数传递给decorator,并用decorator返回的wrapper函数替换被装饰的函数。

之所以Python会开发装饰器,是因为它提供了一种非侵入式的方式来扩展函数和类的功能,不需要修改函数或类的定义。这在一些常见场景下非常有用,比如日志、缓存、权限检查等。

其他语言中也有类似的语法:

  • Java: 注解(Annotations)
  • C#: 特性(Attributes)
  • JavaScript: 高阶函数(Higher-order functions)

虽然语法上有差异,但设计思想都是类似的,都是为了避免直接修改函数或类的定义。装饰器提供了一种优雅的代码封装和重用方式。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表
最新留言