当前位置: 首页 > news >正文

Python functools模块:函数式编程工具的探索之旅

Python functools模块:函数式编程工具的探索之旅

起源

那是天空线科技公司的一个阴雨绵绵的周二,我首次遇到了一个彻底改变我编程方式的问题。我们团队接到任务,需要优化一个日益复杂且难以维护的关键数据处理流水线。当时的代码库就像一张蜘蛛网,充斥着嵌套函数、重复计算和冗长的实现。情况必须改变。

就在那时,我的同事小薇提到了functools模块。"这是标准库中的一颗隐藏宝石,"她带着会意的微笑说道,“可能正是我们需要的。”

我没想到这个建议会引领我踏上一段探索之旅,彻底改变我对Python编程的理解。今天,我要分享这个强大但常被忽视的模块的学习心得。

functools是什么?

Python标准库中的functools模块提供了一系列高阶函数,这些函数可以处理或返回其他函数。它本质上是Python中函数式编程的工具箱,允许你将函数视为一等公民,可以被传递、修改和以强大的方式组合。

该模块在Python 2.5中首次引入,并在后续Python版本中不断扩展功能。它的主要目的是提供处理函数和可调用对象的工具。

functools的核心组件

1. partial() - 创建灵活的函数变体

partial()函数允许你创建新的函数对象,其中预先填充了部分参数。当你想固定函数的某些参数而保持其他参数可变时,这非常有用。

from functools import partialdef power(base, exponent):return base ** exponent# 创建一个始终对参数进行平方的函数
square = partial(power, exponent=2)# 创建一个始终使用2作为底数的函数
powers_of_two = partial(power, base=2)print(square(4))        # 16
print(powers_of_two(exponent=3))  # 8

在这里插入图片描述

我第一次使用这个函数是在构建一个配置系统时,该系统需要针对不同类型的输入使用不同的验证函数。我没有编写多个相似的函数,而是使用partial()创建了变体,这使我们的代码库遵循了DRY(Don’t Repeat Yourself,不要重复自己)原则。

2. lru_cache() - 用于提升性能的记忆化技术

lru_cache()装饰器实现了一个最近最少使用(LRU)缓存,用于存储函数结果。对于计算成本高且使用相同参数重复调用的函数,这可以显著提高性能。

import time
from functools import lru_cache# 使用更高精度的计时器
def precise_time():return time.perf_counter()# 创建两个版本的斐波那契函数进行比较
@lru_cache(maxsize=None)
def fib_cached(n):if n <= 1:return nreturn fib_cached(n-1) + fib_cached(n-2)# 无缓存版本用于直接比较
def fib_uncached(n):if n <= 1:return nreturn fib_uncached(n-1) + fib_uncached(n-2)def demonstrate_performance():print("LRU缓存性能对比演示\n")print("=" * 50)# 使用需要较长计算时间的较大值进行测试test_values = [30, 35, 40]for n in test_values:print(f"\n计算 fibonacci({n}):")print("-" * 50)# 首先测量无缓存版本的性能print(f"无缓存版本:")if n >= 40:  # 对于非常大的值,仅测试较小的值print("  跳过 (计算时间过长)")else:start = precise_time()result = fib_uncached(n)duration = precise_time() - startprint(f"  结果: {result}")print(f"  执行时间: {duration:.6f} 秒")# 清除现有缓存fib_cached.cache_clear()# 缓存版本的第一次调用(构建缓存)print(f"\n带缓存版本 (第一次调用):")start = precise_time()result = fib_cached(n)first_duration = precise_time() - startprint(f"  结果: {result}")print(f"  执行时间: {first_duration:.6f} 秒")# 缓存版本的第二次调用(使用缓存)print(f"\n带缓存版本 (第二次调用):")start 

相关文章:

Python functools模块:函数式编程工具的探索之旅

Python functools模块:函数式编程工具的探索之旅 起源 那是天空线科技公司的一个阴雨绵绵的周二,我首次遇到了一个彻底改变我编程方式的问题。我们团队接到任务,需要优化一个日益复杂且难以维护的关键数据处理流水线。当时的代码库就像一张蜘蛛网,充斥着嵌套函数、重复计…...

吴恩达深度学习复盘(14)迁移学习|项目基本周期

迁移学习 迁移学习是一种机器学习技术&#xff0c;它允许我们将从一个任务中学习到的知识应用到另一个相关的任务中。其核心思想在于&#xff0c;很多情况下&#xff0c;从头开始训练一个模型需要大量的数据和计算资源&#xff0c;而迁移学习能够复用在已有数据上训练好的模型…...

[福游宝——AI智能旅游信息查询平台]全栈AI项目-阶段一:Vite前端开荒

简言 本项目旨在构建一个以AI智能体为核心的福建省旅游信息查询系统&#xff0c;聚焦景点推荐、路线规划、交通天气查询等功能&#xff0c;为游客提供智能化、便捷化的旅游信息服务。项目采用前后端分离架构&#xff0c;前端基于Vite TypeScript Vue3技术栈&#xff0c;搭配…...

SpringCloud-OpenFeign

前言 1.存在问题 远程调用可以像Autowired一样吗 服务之间的通信⽅式,通常有两种:RPC和HTTP. 在SpringCloud中,默认是使⽤HTTP来进⾏微服务的通信,最常⽤的实现形式有两种&#xff1a; RestTemplate OpenFeign RPC&#xff08;RemoteProcedureCall&#xff09;远程过程调⽤&…...

程序化广告行业(79/89):技术革新与行业发展脉络梳理

程序化广告行业&#xff08;79/89&#xff09;&#xff1a;技术革新与行业发展脉络梳理 大家好&#xff01;一直以来&#xff0c;我都热衷于在技术领域不断探索&#xff0c;也深知知识共享对于进步的重要性。写这篇博客&#xff0c;就是希望能和大家一起深入研究程序化广告行业…...

[算法题:快排(一)]颜色分类

1->题目链接 算法题:颜色分类 2->题目解析 数字0表示红色,数字1表示白色,数字2表示蓝色. 这到题说白了就是让我们进行排序,数组中只会有 0 1 2 三种数字 3->算法原理 类⽐数组分两块的算法思想&#xff0c;这⾥是将数组分成三块&#xff0c;那么我们可以再添加⼀个…...

论文精度:YOLOMG:基于视觉的无人机间检测算法——外观与像素级运动融合详解

论文地址:https://arxiv.org/pdf/2503.07115 1. 论文概述 论文标题:YOLOMG: Vision-based Drone-to-Drone Detection with Appearance and Pixel-Level Motion Fusion 作者:Hanqing Guo, Xiuxiu Lin, Shiyu Zhao 发表:未明确会议/期刊(推测为预印本或待发表) 核心贡献:…...

Redis:线程模型

单线程模型 Redis 自诞生以来&#xff0c;一直以高性能著称。很多人好奇&#xff0c;Redis 为什么早期采用单线程模型&#xff0c;它真的比多线程还快吗&#xff1f; 其实&#xff0c;Redis 的“快”并不在于并发线程&#xff0c;而在于其整体架构设计极致简单高效&#xff0c;…...

C++进阶——C++11_{ }初始化_lambda_包装器

目录 1、{ }初始化 1.1 C98的{ } 1.2 C11的{ } 1.3 C11中的std::initializer_list 总结一下&#xff1a; 2、lambda 2.1 lambda的语法 2.2 捕捉列表 2.3 lambda的应用 2.4 lambda的原理 3、包装器 3.1 function 3.2 bind 1、{ }初始化 1.1 C98的{ } C98中一般数组…...

十大PDF解析工具在不同文档类别中的比较研究

PDF解析对于包括文档分类、信息提取和检索在内的多种自然语言处理任务至关重要&#xff0c;尤其是RAG的背景下。尽管存在各种PDF解析工具&#xff0c;但它们在不同文档类型中的有效性仍缺乏充分研究&#xff0c;尤其是超出学术文档范畴。通过使用DocLayNet数据集&#xff0c;比…...

【LeetCode Solutions】LeetCode 160 ~ 165 题解

CONTENTS LeetCode 160. 相交链表&#xff08;简单&#xff09;LeetCode 162. 寻找峰值&#xff08;中等&#xff09;LeetCode 164. 最大间距&#xff08;中等&#xff09;LeetCode 165. 比较版本号&#xff08;中等&#xff09; LeetCode 160. 相交链表&#xff08;简单&#…...

关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例

以下是关于 Spring Boot 微服务解决方案的对比&#xff0c;并以 Spring Cloud Alibaba 为例&#xff0c;详细说明其核心组件的使用方式、配置及代码示例&#xff1a; 关于 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案! https://sca.aliyun.com/?spm7145af80…...

3.1多状态专题:LeetCode面试题17.16 按摩师

动态规划解决按摩师预约问题——以LeetCode面试题17.16为例 1.题目链接 LeetCode面试题17.16 按摩师 2.题目描述 一个有名的按摩师收到一系列的预约请求&#xff0c;每个预约都可以选择接受或不接受。但相邻的预约不能同时接受。给定一个包含各预约时长的数组 nums&#xf…...

Netty基础入门(一)

1.EventLoopGroup 1、概念 EventLoopGroup 是一组 EventLoop&#xff0c;Channel 一般会调用 EventLoopGroup 的 register 方法来绑定其中一个 EventLoop&#xff0c;后续这个 Channel 上的 io 事件都由此 EventLoop 来处理&#xff08;保证了 io 事件处理时的线程安全&#x…...

Transformer模型的自注意机制原理、作用、优缺点,通俗易懂

Transformer模型中的自注意力机制&#xff08;Self - attention Mechanism&#xff09;可以通俗地理解为一种让模型自动关注文本中不同部分之间关系的方法。 工作原理 假设你有一句话“我正在吃苹果”&#xff0c;自注意力机制会让模型去分析每个词和其他词之间的关联程度。比…...

设计模式-结构型模式-代理模式

概述 代理模式: Proxy Pattern : 是一种结构型设计模式. 它允许你提供一个替代对象来代表真实对象&#xff0c;以此控制对真实对象的访问。 通过代理对象&#xff0c;可以在不改变目标对象的前提下&#xff0c;扩展其功能或控制对其的访问。 简单理解 &#xff1a; 代理模式就是…...

大模型开发:源码分析 Qwen 2.5-VL 视频抽帧模块(附加FFmpeg 性能对比测试)

目录 qwen 视频理解能力 messages 构建 demo qwen 抽帧代码分析 验证两个实际 case 官网介绍图 性能对比&#xff1a;ffmpeg 抽帧、decord 库抽帧 介绍 联系 对比 测试结果 测试明细 ffmpeg 100 qps 测试&#xff08;CPU&#xff09; decord 100 qps 测试&#x…...

单调栈 —— 1.基本概念与核心算法

1. 基本概念 1.1 知识预备 在理解单调栈之前&#xff0c;我们需要先掌握两个基础概念&#xff1a;栈&#xff08;Stack&#xff09; 和 单调性&#xff08;Monotonicity&#xff09;。 什么是栈&#xff08;Stack&#xff09; 栈是一种**后进先出&#xff08;LIFO, Last-In…...

Ollama部署大模型 (完整版本、网速慢处理、聊天界面)

切记&#xff01;切记&#xff01;切记&#xff01; Ollama软件下载的模型一般都是别人微调好的&#xff0c;且模型文件与HuggingFace等平台不一样&#xff0c;使用为主&#xff0c;没有官方API可以对模型微调&#xff08;教程都是cpp这类的&#xff0c;没必要这么麻烦去操作&a…...

CMake中add_custom_command用法详解

add_custom_command 是 CMake 中用于在构建过程中添加自定义命令的工具。它通常用于生成文件或在构建特定目标前后执行操作。其行为和执行时机取决于具体使用场景。 主要用法 add_custom_command 有两种典型用法&#xff1a; 1. 生成文件&#xff08;Generating Files&#x…...

基于疾风大模型的新能源储能优化系统:方法、实现与案例分析

一、引言 随着可再生能源渗透率不断提高,储能系统在电力系统中的重要性日益凸显。传统储能控制方法主要基于规则策略和简单优化算法,难以应对高比例新能源场景下的复杂决策需求。本文将详细介绍如何利用疾风大模型(Gale Model)构建智能化的新能源储能优化系统,包含核心方…...

Large Language Model(LLM)的训练和微调

之前一个偏工程向的论文中了&#xff0c;但是当时对工程理论其实不算很了解&#xff0c;就来了解一下 工程流程 横轴叫智能追寻 竖轴上下文优化 Prompt不行的情况下加shot(提示)&#xff0c;如果每次都要加提示&#xff0c;就可以试试知识库增强检索来给提示。 如果希望增强…...

Windows 系统中安装 Git 并配置 GitHub 账户

由于电脑重装系统&#xff0c;重新配置了git. 以下是在 Windows 系统中安装 Git 并配置 GitHub 账户的详细步骤&#xff1a; 1. 安装 Git 访问 Git 官网下载页面下载 Windows 版本的 Git 安装程序运行安装程序&#xff0c;使用默认选项即可 2. 配置 Git 用户信息 打开命令…...

KWDB创作者计划—KWDB场景化创新实践:多模态数据融合与边缘智能的突破性应用

引言&#xff1a;AIoT时代的数据库范式重构 在工业物联网设备数量突破千亿、边缘计算节点覆盖率达75%的2025年&#xff0c;传统数据库面临多模态数据处理效率低下、边缘端算力利用率不足、跨域数据协同困难等核心挑战。KWDB&#xff08;KaiwuDB Community Edition&#xff09;通…...

波束形成(BF)从算法仿真到工程源码实现-第四节-最小方差无失真响应波束形成(MVDR)

一、概述 本节我们讨论最 小 方 差 无 失 真 响 应 (Minimum Variance Distortionless Response, MVDR)波束形成算法&#xff0c;包括原理分析及代码实现。 更多资料和代码可以进入https://t.zsxq.com/qgmoN &#xff0c;同时欢迎大家提出宝贵的建议&#xff0c;以共同探讨学习…...

初阶数据结构--链式二叉树

二叉树&#xff08;链式结构&#xff09; 前面的文章首先介绍了树的相关概念&#xff0c;阐述了树的存储结构是分为顺序结构和链式结构。其中顺序结构存储的方式叫做堆&#xff0c;并且对堆这个数据结构进行了模拟实现&#xff0c;并进行了相关拓展&#xff0c;接下来会针对链…...

嵌入式硬件篇---单片机周期

文章目录 前言 前言 在单片机中&#xff0c;时序控制是其执行指令和协调外设的核心基础。以下是单片机中常见的各种周期及其详细说明&#xff0c;以层次结构展开&#xff1a; 时钟周期&#xff08;Clock Cycle&#xff09; 定义&#xff1a; 时钟周期是单片机的最小时间单位&a…...

嵌入式硬件篇---加法减法积分微分器

文章目录 前言 前言 在模拟电子技术中&#xff0c;加法器、减法器、积分器和微分器是基本的运算电路&#xff0c;通常基于运算放大器&#xff08;运放&#xff09;实现。以下是它们的核心原理、典型结构和应用场景&#xff1a; 加法器&#xff08;Summing Amplifier&#xff0…...

解决使用VsCode远程ssh连接虚拟机ubuntu需要重复输入密码

1. windows打开windows powershell并输入如下命令 ssh-keygen -t ed25519 -C 你的随意一个邮箱2. 从路径C:\Users\PC.ssh下找到id_ed25519.pub并打开 复制里面全部内容 3. 切换到ubuntu $ cd .ssh/ $ vi authorized_keys 将前一步复制的内容粘贴进去并保存4. vscode重新连接…...

1558 找素数

1558 找素数 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;质数 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a sc.…...

[Android] PDF编辑器 Xodo PDF Reader 9.13.3 (不完全汉化,能用)

[Android] PDF编辑器 Xodo PDF 链接&#xff1a;https://pan.xunlei.com/s/VONeDpxJVwfmeSZu36RvZzSfA1?pwdv67d# 全面的 PDF 查看和批注 支持多种文件格式&#xff0c;包括 PDF 和 Microsoft Office 文档。提供用于添加注释、突出显示文本和为内容添加下划线的工具。包括夜…...

STM32LL库编程系列第八讲——ADC模数转换

系列文章目录 往期文章 STM32LL库编程系列第一讲——Delay精准延时函数&#xff08;详细&#xff0c;适合新手&#xff09; STM32LL库编程系列第二讲——蓝牙USART串口通信&#xff08;步骤详细、原理清晰&#xff09; STM32LL库编程系列第三讲——USARTDMA通信 STM32LL库编程…...

forms+windows添加激活水印

formswindows添加激活水印 多语言水印文本&#xff0c;根据系统语言自动切换。水印显示在每个屏幕的右下角&#xff0c;位置动态调整。半透明灰色文字&#xff0c;微软雅黑字体。窗口无边框、置顶、透明背景&#xff0c;不干扰用户操作。支持多显示器。高DPI适配。 效果图&am…...

ubuntu 服务器版本网络安全

1. 系统更新与补丁管理 定期更新系统 sudo apt update && sudo apt upgrade -y # 更新所有软件包 sudo apt autoremove # 清理旧内核和依赖启用自动安全更新 修改 /etc/apt/apt.conf.d/50unattended-upgrades&#xff0c;确保安全更新自动安装&#xff1a; Unatt…...

C++之map,set的实现

目录​​​​​​​ 一、红黑树的修改 1.1、节点结构 1.2、迭代器 1.3、红黑树的结构 二、map的封装 三、set的封装 一、红黑树的修改 首先&#xff0c;我们使用红黑树来封装map和set&#xff0c;其次我们实现的map和set想要复用同一个红黑树&#xff0c;所以我们需要对之…...

Elasticsearch:使用稀疏向量提升相关性

作者&#xff1a;来自 Elastic Vincent Bosc 学习如何在 Elasticsearch 中使用稀疏向量&#xff0c;以最小的复杂性提升相关性并实现搜索结果个性化。 稀疏向量是 ELSER 中的关键组件&#xff0c;但它们的用途远不止于此。在这篇文章中&#xff0c;我们将探讨稀疏向量如何在电商…...

SQL:Normalization(范式化)

目录 Normalization&#xff08;范式化&#xff09; 为什么需要 Normalization&#xff1f; &#x1f9e9; 表格分析&#xff1a; 第一范式&#xff08;1NF&#xff09; 什么是第一范式&#xff08;First Normal Form&#xff09;&#xff1f; 第二范式&#xff08;2NF&am…...

在pycharm中搭建yolo11分类检测系统1--PyQt5学习(一)

实验条件&#xff1a;pycharm24.3autodlyolov11环境PyQt5 如果pycharm还没有配PyQt5的话就先去看我原先写的这篇博文&#xff1a; PyQT5安装搭配QT DesignerPycharm&#xff09;-CSDN博客 跟练参考文章&#xff1a; 目标检测系列&#xff08;四&#xff09;利用pyqt5实现yo…...

Neo4j GDS-12-neo4j GDS 库中节点插入(Node Embedding)算法介绍

neo4j GDS 系列 Neo4j APOC-01-图数据库 apoc 插件介绍 Neo4j GDS-01-graph-data-science 图数据科学插件库概览 Neo4j GDS-02-graph-data-science 插件库安装实战笔记 Neo4j GDS-03-graph-data-science 简单聊一聊图数据科学插件库 Neo4j GDS-04-图的中心性分析介绍 Neo…...

【论文阅读】RMA: Rapid Motor Adaptation for Legged Robots

Paper: https://arxiv.org/abs/2107.04034Project: https://ashish-kmr.github.io/rma-legged-robots/Code: https://github.com/antonilo/rl_locomotion训练环境&#xff1a;Raisim 1.方法 RMA&#xff08;Rapid Motor Adaptation&#xff09;算法通过两阶段训练实现四足机器…...

C语言数据结构:树的实现、前序、中序、后序遍历

一、什么是树 树是一种非线性的数据结构&#xff0c;由若干个节点组成。每个节点都包含数据&#xff0c;并且可以有多个子节点。树的最顶端是一个特殊的节点&#xff0c;叫根节点&#xff0c;它没有父节点。从根节点开始&#xff0c;树不断向下分叉&#xff0c;形成不同的层次…...

PostgreSQL:逻辑复制与物理复制

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

单片机Day05---动态数码管显示01234567

一、原理图 数组索引段码值二进制显示内容00x3f0011 1111010x060000 0110120x5b0101 1011230x4f0100 1111340x660110 0110450x6d0110 1101560x7d0111 1101670x070000 0111780x7f0111 1111890x6f0110 11119100x770111 0111A110x7c0111 1100B120x390011 1001C130x5e0101 1110D140…...

STM32江科大-----SPI

声明&#xff1a;本人跟随b站江科大学习&#xff0c;本文章是观看完视频后的一些个人总结和经验分享&#xff0c;也同时为了方便日后的复习&#xff0c;如果有错误请各位大佬指出&#xff0c;如果对你有帮助可以点个赞小小鼓励一下&#xff0c;本文章建议配合原视频使用❤️ 如…...

OBS SDK 中 ffmpeg_muxer 与 ffmpeg_output 的区别与使用 QSV 编码器的正确方式

在使用 OBS SDK 开发录制或推流功能时,开发者可能会遇到两个看似相似却完全不同的输出类型:ffmpeg_muxer 和 ffmpeg_output。它们的使用方式、编码器支持范围以及配置方式都有显著区别,特别是在使用硬件编码器(如 Intel QSV)时,选择正确的输出类型至关重要。 本文将重点…...

基于AOP+Log4Net+AutoFac日志框架

1.项目概述 这是一个基于 C# 的 WPF 项目 WpfApp12log4net&#xff0c;它综合运用了依赖注入、日志记录和接口实现等多种技术&#xff0c;同时使用了 Autofac、Castle.Core 和 log4net 等第三方库。 2.配置log4net 新建一个Log4Net.config&#xff0c;配置需要记录的日志信息…...

【Hadoop入门】Hadoop生态之Yarn简介

1 什么是Yarn&#xff1f; Yarn&#xff08;Yet Another Resource Negotiator&#xff09; 是Hadoop生态系统中的资源管理和调度框架&#xff0c;负责为上层应用提供统一的资源管理和调度服务。 是Hadoop 2.0引入的重要架构改进&#xff0c;成为Hadoop集群的资源管理层&#xf…...

猫咪如厕检测与分类识别系统系列【三】融合yolov11目标检测

✅ 前情提要 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠…...

qt的基本使用

先教大家如何基本使用qt&#xff0c;这样是为了后面的服务器使用做铺垫 安装测试用例的创建创建qt界面程序后讲解各文件的作用qt的界面控件实现逻辑功能的流程测试效果 我会写一个测试用例方便大家了解与使用 安装 参考这个文章来安装&#xff0c;链接: qt安装 测试用例的创建…...

Spring AI使用tool Calling和MCP

深入探索 Spring AI Spring AI版本1.0.0.M6 在人工智能与软件开发深度融合的时代&#xff0c;Spring AI 作为一个强大的框架&#xff0c;持续为开发者提供着高效且便捷的工具&#xff0c;以实现与大语言模型&#xff08;LLM&#xff09;的无缝交互。Spring AI 的最新版本引入了…...