首页 > 其他分享 >测量并打印出被装饰函数的执行时间,优化递归函数

测量并打印出被装饰函数的执行时间,优化递归函数

时间:2024-07-05 12:30:57浏览次数:19  
标签:并打印 return 函数 递归函数 timer fibonacci time 装饰

定义了一个装饰器timer,它测量并打印出被装饰函数的执行时间。这个装饰器使用了Python的time模块来记录函数开始和结束的时间点,然后计算并输出函数的运行时长。使用@timer语法将这个装饰器应用到了fibonacci函数上,这是一个递归实现的斐波那契数列计算函数。

当调用fibonacci(10)时,timer装饰器会自动捕获函数执行前后的时刻,并计算两者之差,即函数的实际运行时间。然后,它会打印出函数名称以及该函数执行所花费的时间,单位是秒。最后,它返回fibonacci函数的计算结果。

然而,值得注意的是,递归实现的斐波那契数列计算在n较大时效率非常低下,因为它重复计算了许多相同的子问题。在实际应用中,特别是对于较大的n值,通常会采用动态规划或记忆化递归来提高效率。例如,你可以使用一个缓存机制来存储已经计算过的斐波那契数值,避免重复计算。

import time
from functools import lru_cache

# 定义一个装饰器,用于打印函数的执行时间
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} took {end - start} seconds to run.")
        return result
    return wrapper

# 使用lru_cache装饰器缓存结果,优化递归函数
@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

# 使用@符号将timer装饰器应用到fibonacci函数上
fibonacci = timer(fibonacci)

# 调用fibonacci函数,会自动打印执行时间
fibonacci(10)

标签:并打印,return,函数,递归函数,timer,fibonacci,time,装饰
From: https://blog.csdn.net/weixin_45339016/article/details/140205046

相关文章

  • 【python学习笔记】Python装饰器
    装饰器参考:搞懂Python装饰器Python@wraps修饰器装饰器是什么有兴趣的可以参考PEP318的原文DecoratorsforFunctionsandMethods解释了语法用途以及设计出来装饰器的动机Thecurrentmethodfortransformingfunctionsandmethods(forinstance,declaringthem......
  • 花里胡哨的装饰器
    千万别被名字给吓到了,什么叫做装饰器?顾名思义,就是给另一个函数进行装饰用的,简单说就是给别的函数添加额外的功能。注意,装饰器的本质就是一个函数。装饰器=高阶函数+函数嵌套+闭包一、高阶函数满足如下两个条件任何一个就属于高阶函数:(1)函数的参数是一个函数(2)函数的返......
  • csrf跨站请求,钓鱼网站实现示例,CSRF校验,CSRF相关装饰器,Auth模块,扩展Auth表
    ⅠDjango框架之csrf跨站请求【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而......
  • Django框架之Cookie和Session概念,Django操作cookie,Django操作Session,CBV添加装饰器
    ⅠDjango框架之Cookie和Session概念【一】Cookie与Session的发展史Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术。【1】Cookie的发展史1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户......
  • flask cbv加装饰器
    cbv加装饰器fromflaskimportFlaskfromflask.viewsimportMethodViewapp=Flask(__name__)app.debug=True###登录认证--->不能公用--》要么只能给fbv用,要么只能给cbv用defauth(func):definner(*args,**kwargs):print(args)#cbv,会有第一个参......
  • java设计模式--装饰器模式
    装饰器模式是一种结构型设计模式,它允许你动态地向对象添加额外的行为。装饰器模式通过将对象包装在一个装饰器类中,以提供额外的功能,而不是修改原始对象的结构。装饰器模式主要解决的问题是在不改变现有对象结构的情况下,动态地添加功能或修改行为。它可以避免使用子类继承的方式引......
  • python 趣味习题_递归函数(炸弹迷宫的走法)
    @[toc]python学习中,常会遇到一些百思不得其解的难题,但有时“灵光一现”找准方法,难题便会迎刃而解。本专栏旨在记录本人解决问题的思考方法,及实现过程。有更好方法或对程序执行有疑问的伙伴,可在评论区留言,共同讨论。题目要求题目描述:在一串连续的迷宫(房间编号为1-11的......
  • 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器
    1、前言我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化。本章将要介绍的就是:@Props装饰器。2、@Props装饰器@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装......
  • 【鸿蒙实战开发】HarmonyOS-ArkUI教程@link装饰器双向数据传递的使用
    前言2024年可谓至关重要,而生态建设的前提,就是要有足够的开发人才。与之对应的,今年春招市场上与鸿蒙相关岗位和人才旺盛的热度,一方面反应了鸿蒙生态的逐渐壮大,另一方面也让人们对鸿蒙下一阶段的发展更具信心。随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的......
  • JDBC实例:执行遍历查询操作,并打印查询结果
     //导入了Java的SQL包importjava.sql.*;publicclassMain{publicstaticvoidmain(String[]args)throwsException{//注册MySQL的JDBC驱动Class.forName("com.mysql.jdbc.Driver");//连接自己的数据库,我连接了数据库“pinta”St......