Python - 递归函数(Recursive Function)的速度优化 (Python实现)

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/140137432

免责声明:本文来源于个人知识与开源资料,仅用于学术交流,不包含任何商业技术,欢迎相互学习,不支持转载。


Recursive

递归函数 是特殊的编程技术,通过调用自身来解决问题。递归函数通常包含两个关键部分:基线条件(Base Case)递归步骤(Recursive Step),包括:

  • 递归函数(Recursive Function):递归函数是调用自身的函数。允许程序,通过将问题分解为更小的、更易于管理的子问题,来解决问题。递归函数通常用于解决可以自然分解为相似子问题的问题,如树的遍历、排序算法(如快速排序和归并排序)等。
  • 基线条件(Base Case):基线条件是递归函数中,用来停止递归调用的条件。没有基线条件,递归将无限进行下去,最终导致栈溢出错误。基线条件通常是一个或多个特定情况,当满足这些条件时,递归函数将返回一个不需要进一步递归调用的值。
  • 结果缓存(Memoization):结果缓存是一种优化技术,用于存储递归函数的计算结果,以避免重复计算相同的子问题。这在具有大量重复计算的递归算法中非常有用。通过缓存结果,显著提高递归函数的性能,在 Python 中,使用字典结构 dict() 作为缓存。
  • LRU 缓存装饰器(LRU Cache Decorator):LRU,即 Least Recently Used,是常用于缓存最近最少使用的数据的数据结构。LRU缓存装饰器可以应用于递归函数,以实现自动的结果缓存和过期策略。这有助于管理内存使用,提高具有大量重复调用的递归函数的性能。
  • 生成器(Generator):生成器是一种特殊的迭代器,允许惰性地生成值,即一次生成一个值,而不是一次性生成所有值。在 Python 中,生成器使用 yield 关键字实现。生成器对于处理大型数据集或实现复杂的迭代逻辑非常有用,并且可以与递归结合使用,以简化代码并提高效率。

运行效率排序:迭代 > LRU 缓存 > 字典缓存 > 普通递归

即:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/7/2
"""import timedef fib2(n):"""递归实现斐波那契数列"""if n <= 1:  # 基线条件return nreturn fib2(n - 2) + fib2(n - 1)memo = {0: 0, 1: 1}def fib3(n):"""递归实现斐波那契数列,使用字典缓存"""if n in memo:return memo[n]memo[n] = fib3(n - 2) + fib3(n - 1)return memo[n]from functools import lru_cache@lru_cache(maxsize=None)
def fib4(n):"""递归实现斐波那契数列,使用lru_cache缓存"""if n <= 1:  # 基线条件return nreturn fib4(n - 2) + fib4(n - 1)def fib5(n):"""迭代实现斐波那契数列"""if n == 0:return 0last, _next = 0, 1for _ in range(1, n):last, _next = _next, last + _nextreturn _nextdef fib6(n):"""生成器输出斐波那契数列"""yield 0if n > 0:yield 1last, _next = 0, 1for _ in range(1, n):last, _next = _next, last + _nextyield _nextif __name__ == '__main__':s_time = time.time()print(f"fib2: {fib2(30)}, time: {(time.time() - s_time)*1000:.4f} ms")s_time = time.time()print(f"fib3: {fib3(30)}, time: {(time.time() - s_time)*1000:.4f} ms")s_time = time.time()print(f"fib4: {fib4(30)}, time: {(time.time() - s_time)*1000:.4f} ms")s_time = time.time()print(f"fib5: {fib5(30)}, time: {(time.time() - s_time)*1000:.4f} ms")for i in fib6(10):print(i, end=' ')

运行输出:

fib2: 832040, time: 213.8369 ms
fib3: 832040, time: 0.0222 ms
fib4: 832040, time: 0.0148 ms
fib5: 832040, time: 0.0043 ms
0 1 1 2 3 5 8 13 21 34 55 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

余承东在母校西工大毕业典礼演讲:定位决定地位,眼界决定境界。

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 【6月29日&#xff0c;西北工业大学2024届本科生毕业典礼暨学位授予仪式隆重举行。典礼上&#xff0c;华为常务董事、终端BG 董事长、智能汽车解决方案BU 董事长余承东作为校友代表致辞&#xff0c;为毕业生…

Linux_fileio实现copy文件

参考韦东山老师教程&#xff1a;https://www.bilibili.com/video/BV1kk4y117Tu?p12 目录 1. 通过read方式copy文件2. 通过mmap映射方式copy文件 1. 通过read方式copy文件 copy文件代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <…

Python知识点背诵手册,超详细知识梳理

一、手册介绍 《Python知识点背诵手册》是一份详尽的Python学习资料&#xff0c;旨在帮助学习者系统地掌握Python语言的基础知识和进阶技能。该手册将Python的所有关键语法和概念进行了精炼的总结&#xff0c;并以易于理解和记忆的方式呈现。以下是手册的主要特点和内容概述&a…

Kafka-时间轮和延迟操作-源码流程

TimingWheel 字段&#xff1a; buckets&#xff1a;Array.tabulate[TimerTaskList]类型&#xff0c;其每一个项都对应时间轮中的一个时间格&#xff0c;用于保存 TimerTaskList的数组。在TimingWheel中&#xff0c;同一个TimerTaskList中的不同定时任务的到期时间可能 不同&a…

YOLO-world论文阅读笔记

论文&#xff1a;https://arxiv.org/abs/2401.17270 code: https://github.com/AILab-CVC/YOLO-World 1、为什么要做这个研究&#xff08;理论走向和目前缺陷&#xff09; ? 之前的开集检测器大多比较慢&#xff0c;不利于部署。 2、他们怎么做这个研究 &#xff08;方法&…

【鸿蒙学习笔记】基础组件Blank:空白填充组件

Blank&#xff1a;空白填充组件 Column({ space: 20 }) {Row() {Text(Bluetooth)Blank().color(Color.Yellow)Toggle({ type: ToggleType.Switch }).margin({ top: 14, bottom: 14, left: 6, right: 6 })}.backgroundColor(Color.Pink).borderRadius(15).padding({ left: 12 }…

数组-长度最小的子数组

M长度最小的子数组&#xff08;leetcode209&#xff09; /*** param {number} target* param {number[]} nums* return {number}*/ var minSubArrayLen function(target, nums) {const n nums.length;let ans n 1;let sum 0; // 子数组元素和let left 0; // 子数组…

2024 MWC上海:创新力量驱动未来先行,移远智慧点亮数字蓝海

6月26日&#xff0c;2024年世界移动通信大会&#xff08;MWC上海&#xff09;如期举行&#xff0c;今年的展会以“未来先行”为主题&#xff0c;涵盖“超越 5G、数智制造和人工智能经济”三大技术主题。移远通信作为全球物联网行业的引领者之一&#xff0c;今年不仅在展示内容上…

终极指南:RNNS、Transformers 和 Diffusion 模型

一、说明 作为广泛使用这些工具和模型的人&#xff0c;我的目标是解开 RNN、Transformer 和 Diffusion 模型的复杂性和细微差别&#xff0c;为您提供详细的比较&#xff0c;为您的特定需求提供正确的选择。 无论您是在构建语言翻译系统、生成高保真图像&#xff0c;还是处理时间…

RK3568平台(USB篇)USB HID设备

一.USB HID设备简介 USB HID设备主要用于和计算机进行交互通信&#xff0c;典型的USB HID类设备包括USB键盘、USB鼠标、USB游戏手柄等等&#xff0c;这些都是日常生活中常见的设备。以USB接口的鼠标为例&#xff0c;打开计算机的“设备管理器”&#xff0c;可以在“鼠标和其他…

C++ ariac2 Windows库编译

cd "F:\\aria2" gmp-6.1.2.tar.lz expat-2.2.0.tar.bz2 sqlite-autoconf-3160200.tar.gz zlib-1.2.11.tar.gz c-ares-1.12.0.tar.gz libssh2-1.8.0.tar.gz --enable-libaria2 --enable-static libgnutls-dev&#xff08;对于HTTPS&#xff0c;BitTorrent&#xff0…

【Redis7】零基础篇

1 课程概述 2 Redis入门概述 2.1 是什么 Redis是基于内存的KV键值对内存数据库 Redis&#xff1a;Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c…

阿里Nacos下载、安装(保姆篇)

文章目录 Nacos下载版本选择Nacos安装Windows常见问题解决 更多相关内容可查看 Nacos下载 Nacos官方下载地址&#xff1a;https://github.com/alibaba/nacos/releases 码云拉取&#xff08;如果国外较慢或者拉取超时可以试一下国内地址&#xff09; //国外 git clone https:…

ssh网关-sshpiper

1、环境 操作系统&#xff1a;龙蜥os 7.9 sshpiper&#xff1a;1.3.1 2、下载软件 https://github.com/tg123/sshpiper/releases 3、解压到指定目录 mkdir /opt/sshpiper tar -xvf sshpiperd_with_plugins_linux_x86_64.tar.gz -C /opt/sshpipe4、添加执行权限 chmod x /o…

[开源软件] 支持链接汇总

“Common rules: 1- If the repo is on github, the support/bug link is also on the github with issues”" label; 2- Could ask questions by email list;" 3rd party software support link Note gcc https://gcc.gnu.org openssh https://bugzilla.mindrot.o…

《昇思25天学习打卡营第9天|onereal》

继续学习昨天的 基于MindNLPMusicGen生成自己的个性化音乐 生成音乐 MusicGen支持两种生成模式&#xff1a;贪心&#xff08;greedy&#xff09;和采样&#xff08;sampling&#xff09;。在实际执行过程中&#xff0c;采样模式得到的结果要显著优于贪心模式。因此我们默认启…

K6 性能测试教程:入门介绍,环境搭建和编写第一个 K6 测试脚本

K6 性能测试教程&#xff1a;入门介绍&#xff0c;环境搭建和编写第一个 K6 测试脚本 这篇文章将带您进入 K6 性能测试的世界。博文内容涵盖了 K6 性能测试的入门知识、环境搭建步骤&#xff0c;以及如何编写您的第一个测试脚本。无论您是初学者还是有经验的性能测试专业人员&…

详解C语言分支与循环语句

分支语句 if elseswitch 循环语句 whilefordo while goto语句 文章目录 1.什么是语句2.分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.3 练习 2.2 switch语句2.2.1 在switch语句中的break2.2.2 default子句 3.循环语句3.1 while循环3.1.1 while语句中…

【Linux进程通信】使用匿名管道制作一个简单的进程池

进程池是什么呢&#xff1f;我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继…

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了&#xff0c;我们在拿下web权限过后&#xff0c;我们要看自己拿下的是什么权限&#xff0c;可能是普通的用户权限&#xff0c;这个连添加用户都不可以&#xff0c;这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…