python 装饰器打印函数运行时间

import time


# 打印函数时间装饰器
def print_time(func):
    def inner(*args, **kwargs):
        old_time = time.time()
        result = func(*args, **kwargs)
        func_name = str(func).split(' ')[1]
        print('{} use time: {}s'.format(func_name, time.time() - old_time))
        return result

    return inner


@print_time
def func():
    time.sleep(3)


func()

运行结果:
func use time: 3.000530958175659s

Python中的装饰器是一种非常强大的工具,它可以让我们在不改变原函数功能的基础上添加额外的功能或更改其行为。简单来说,装饰器本质上就是一个返回函数的高阶函数。通过将装饰器应用于函数,我们可以动态地修改该函数的行为,而无需修改函数本身的定义。 ### Python装饰器的基本原理 装饰器的主要作用之一就是修改函数的行为,比如增加日志记录、添加缓存、验证权限等。这是通过在函数定义前加上特殊语法来实现的,这个语法包括在函数定义前加上 '@装饰器名' 的形式。 例如,考虑一个简单的装饰器 `logger`,它可以打印出函数被调用的时间和名称: ```python import time def logger(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() elapsed_time = end_time - start_time print(f"{func.__name__} ran in {elapsed_time:.6f}s") return result return wrapper @logger def example_function(a, b): return a + b result = example_function(3, 4) ``` 在这个例子中,`example_function` 函数在其前添加了 `@logger` 标记。当 `example_function` 被调用时,实际上调用的是 `wrapper` 函数,这个函数会在运行 `example_function` 之前和之后分别记录时间,并打印出所需信息。 ### 示例:加法缓存装饰器 装饰器还可以用于实现缓存功能,避免函数多次计算相同输入的结果。这在性能优化中有广泛的应用。下面是一个简单的装饰器实现: ```python def memoize(func): cache = dict() def wrapper(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrapper @memoize def fibonacci(n): if n < 2: return n else: return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(10)) ``` 在这个例子中,`memoize` 装饰器保存了函数的所有计算结果,下次再有相同的输入时,直接从缓存中取出结果,提高了效率。 ### 相关问题: 1. **为什么需要装饰器**? 答:装饰器提供了一种简洁的方式来封装和扩展现有函数的功能,如日志记录、错误处理、性能监控、数据验证等,而无需修改原始函数的源代码。 2. **如何创建自定义装饰器**? 答:创建自定义装饰器涉及编写一个高阶函数,该函数接收一个函数作为参数,并返回一个新的函数。新函数负责在调用原函数之前或之后执行额外的操作。 3. **装饰器是否影响函数的属性**? 答:装饰器通常不会影响函数自身的属性,如 `__name__` 和 `__doc__`。但是,装饰器可以覆盖或增强这些属性的功能。例如,装饰器可以修改函数的帮助文档或名字以便于调试或管理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值