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,一经查实,立即删除!

相关文章

23-Padans Timedelta时间差

Padans Timedelta时间差 Timedelta 表示时间差&#xff08;或者时间增量&#xff09;&#xff0c;我们可以使用不同的时间单位来表示它&#xff0c;比如&#xff0c;天、小时、分、秒。时间差的最终的结果可以是正时间差&#xff0c;也可以是负时间差。 Timedelta类周期名、对…

nvm Node.js 版本的命令行工具使用

简介 NVM 是 Node Version Manager 的缩写&#xff0c;它是一个用于管理 Node.js 版本的命令行工具。通过NVM&#xff0c;你可以在同一台机器上安装和切换多个 Node.js 版本&#xff0c;对于开发和测试在不同 Node.js 版本上运行的应用程序非常有用。 安装 https://github.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;方法&…

javascript输出语法

javascript输出有三种方式 一种是弹窗输出&#xff0c;就是网页弹出一个对话框&#xff0c;弹出输出内容 语法是aler(内容) 示例代码如下 <body> <script> alert(你好); </script> </body> 这段代码运行后网页会出现一个对话框&#xff0c;弹出你…

【鸿蒙学习笔记】基础组件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;今年不仅在展示内容上…

机器人----四元素

四元素 四元素的大小 [-1,1] 欧拉角转四元素

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

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

【FFmpeg】avcodec_find_encoder和avcodec_find_decoder

目录 1.avcodec_find_encoder2.avcodec_find_decoder3.小结 FFmpeg相关记录&#xff1a; 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调用ffmpeg库进行RTMP推流和拉流 【FFmpeg】调用ffmpeg库进行SDL2解码后渲染 流…

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…

C语言笔记27 •单链表介绍•

1.链表的概念及结构 链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 2. 顺序表带来的问题 (1)中间/头部的插⼊删除&#xff0c;时间复杂度为O(N) (2)增容需要申请新空间&#xff0c;拷⻉数据&#xff…

【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:…

Kafka 管理TCP连接

生产者管理TCP连接 Kafka生产者程序概览 Kafka的Java生产者API主要的对象就是KafkaProducer。通常我们开发一个生产者的步骤有4步&#xff1a; 第1步&#xff1a;构造生产者对象所需的参数对象。 第2步&#xff1a;利用第1步的参数对象&#xff0c;创建KafkaProducer对象实例…