感谢您的记忆

认识我的人都知道我的记忆力绝对是垃圾。任何缺少 monty python 对白和 90 年代另类摇滚乐队曲目列表的内容,我都无法接受。 然而,对我们来说幸运的是,计算机在记住事物方面的能力要强得多。

概念

我们今天讨论的技术称为记忆化。让我们从讨论纯函数开始。纯函数背后的想法是,无论你给它什么输入,它总是会给出相同的输出。现在考虑一下您是否有一个进程密集型功能或需要大量开销的功能。如果您已经知道在提供一组特定参数时运行该函数的结果,为什么要利用您的资源再次运行它。记忆化允许我们使用该函数的参数作为键来存储该函数先前执行的结果。以下代码片段演示了记忆函数的样子:

处决

const memoize = {};const getResult = async (n1, n2) => {  const key = `${n1}_${n2}`;  if (!memoize[key]) {    memoize[key] = await resourceIntensiveFunction(n1, n2);  }  return memoize[key];};

让我们看一下代码。我们从一个名为 memoize 的对象开始,它将存储我们的参数和结果作为键值集。接下来我们有一个名为 getresult 的函数,它带有两个参数:n1 和 n2。为了简单起见,我们假设顺序很重要。我们将使用两个参数的串联来创建一个变量键。

现在我们需要检查 memoize 对象是否包含该键的值。我们检查,如果没有,我们别无选择,只能运行资源密集型功能。如果我们运行该函数,我们还必须将结果存储在记忆对象中以供将来执行。这样,下次针对这些相同的参数运行此函数时,它将在对象中找到结果并跳过资源密集型函数。

记住之前运行过的查询

感谢您的记忆

先前未运行查询时进行记忆

感谢您的记忆

好处

这在许多场景中都很有用。例如,如果您有一系列需要大量时间和资源的长计算,那么这就是值得进行的优化。如果您有需要高网络吞吐量或大量临时磁盘空间的东西,它也可能很有价值。对于任何这些场景,优点有两个:它消除了运行先前已执行的函数的需要,并且为需要计算的函数释放了资源,因为它们不会与已映射的函数竞争资源.

挑战

在某些情况下这可能不是正确的方法,所以不要总是使用这种范例。如果您的函数不是纯函数并且它会根据外部因素而变化,那么您不想使用这种方法,因为它总是会为您提供第一次运行时的值,而不考虑其他变量。如果应用程序很少使用同一组参数运行该函数,您也不想使用它。在这种情况下,您将拥有越来越大的很少被使用的数据结构。

记忆就差不多了。这是一个非常简单的模式,名字听起来却很吓人。它有很多应用程序,希望这能让您更好地了解幕后发生的事情。现在,请原谅,我必须去记住今晚我要做什么。

源代码可在 github 上获取

以上就是感谢您的记忆的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1499505.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 21:50:30
下一篇 2025年12月19日 21:50:35

相关推荐

  • LeetCode 的 JavaScript 时代实际上填补了空白

    大多数编码挑战都会教你解决难题。 leetcode 的 30 天 javascript 学习计划做了一些不同的事情:它向您展示了拼图如何变成砖块,准备好构建现实世界的项目。 这种区别很重要。当您解决典型的算法问题时,您正在训练您的思维进行抽象思考。但是,当您实现去抖1函数或构建事件发射器2时,您正在…

    2025年12月19日
    000
  • 在 React JS 项目中设置 Tailwind CSS

    如果您还没有 react 应用程序,请创建一个: npx create-react-app my-appcd my-app 安装 tailwind css运行以下命令安装 tailwind css 及其依赖项: npm install -d tailwindcss postcss autoprefi…

    2025年12月19日
    000
  • agilbo 让敏捷项目管理变得轻松

    在当今快节奏的商业世界中,适应性和效率对于成功至关重要。企业不仅必须提供高质量的产品,还必须快速响应不断变化的需求。敏捷产品项目管理已成为一种改变游戏规则的方法,使团队能够协作、适应并交付卓越的结果。 Agilibo 凭借其创新平台,提供了完美的工具包来支持企业采用敏捷方法并实现其目标。 了解敏捷产…

    2025年12月19日
    000
  • React 最终稳定、新的基于 Rust 的 JavaScript 框架、新的开发人员工具等等

    欢迎来到另一版“JavaScript 本周”! 我们将讨论 React 的最新稳定版本、Boa 的最新性能飞跃以及使您的开发工作流程更加顺畅的工具。 React 19:异步功能变得简单 React 19 正式稳定!以下是使该版本成为开发者游戏规则改变者的原因: 操作:新功能可轻松处理表单提交、错误状…

    2025年12月19日
    000
  • Qwik 可恢复性解释

    Qwik 中的可恢复性是一个革命性的概念,它最大限度地减少了需要在客户端下载和执行的 JavaScript 数量。 它允许 Qwik 应用程序从服务器上中断的位置“恢复”,而无需在客户端上重播或补充整个应用程序状态。 以下是 Qwik 中可恢复性的解释: 1。带有应用程序状态的预渲染 HTML: Q…

    2025年12月19日
    000
  • Osita 是一位熟练的开发人员,擅长 JavaScript,在 React、Node、Express 方面拥有专业知识

    欢迎来到我的世界 大家好,我是 Christopher Osita,一位充满激情的全栈开发人员、企业家,也是 Siitecch(发音为“see-tech”)背后的创造力。我的职业生涯致力于让技术变得简单、易于使用且有意义。无论您来这里是为了更多地了解我的旅程、我的专业知识,还是我对未来的愿景,欢迎光…

    2025年12月19日
    000
  • 构建 Expressjs 后端服务应该很容易!

    构建 node.js api 服务应该很容易,但许多开发人员在需要启动新的后端服务时却遇到了困难。每个月都会有新的方法来设置您的 node.js 项目、新的身份验证或安全性最佳实践、新框架,或者您最喜欢的 npm 包自上次使用以来发生了重大更改。 每次我与使用 Node.js 的后端开发人员交谈时,…

    2025年12月19日
    000
  • JavaScript 中 return 和 return wait 的区别

    您可能会认为这两种方法是相同的。但 return 和 return wait 之间有一个至关重要的区别。 当我们处理promise时,比如数据库查询,我们通常使用await。例如: async function getuserbyid(userid) { const user = await use…

    2025年12月19日
    000
  • 理解面向对象编程中的上帝对象

    介绍 在面向对象编程 (oop) 中,开发人员努力追求干净、模块化的代码,并遵守单一职责和封装等原则。然而,有一种反复出现的反模式可以将代码库变成维护噩梦:上帝对象。 god object 是一个承担了太多职责的对象,成为各种不相关操作的中心点。虽然最初看起来很方便,但随着时间的推移,它会导致紧密耦…

    2025年12月19日
    000
  • 将循环转换为递归:模板和尾递归解释

    递归和循环都是在编程中实现重复任务的基本工具。虽然 for 和 while 等循环对于大多数开发人员来说都很直观,但递归提供了一种更抽象、更灵活的解决问题的方法。本文探讨了如何将循环转换为递归函数,提供通用模板,并解释尾递归的概念和优化。 理解递归 什么是递归? 递归是一种函数调用自身来解决同一问题…

    2025年12月19日
    000
  • 斯堪的纳维亚航空因无障碍问题被罚款 10 美元

    他们在两个不同的市场面临法律诉讼。 您知道吗,2017 年,挪威政府给斯堪的纳维亚航空公司 (SAS) 12 个月的时间来修复其网站上的辅助功能错误。 SAS 没有构建可与 WCAG 内联访问的主网站,而是根据第三方公司的建议创建了一个单独的网站。他们为残障人士创造了单独的“辅助”体验。 为残障人士…

    2025年12月19日
    000
  • 掌握 JavaScript 中的高阶函数

    现代 javascript 开发严重依赖函数式编程,掌握其基本思想将极大提高你的编码能力。 高阶函数是这个范式最有力的武器之一。为了帮助您掌握它们,本文将介绍它们的定义、应用程序和独特的实现。 1. 函数式编程 函数式编程是一种编程范式,强调: 纯函数:没有副作用的函数,对于相同的输入返回相同的输出…

    2025年12月19日
    000
  • Rino,使用 HTML、CSS 和 Typescript/Javascript 的简单静态网站构建器

    快速学习、预处理、直观的网站构建器 rino.js 是您的首选 web 框架,用于使用 html、css 和 typescript/javascript 构建高效的静态网站。它专为各个级别的开发人员而设计,通过将标准 web 技术的强大功能与简化的预处理工具相结合,简化了 web 开发。 要求 no…

    2025年12月19日
    000
  • 了解 JavaScript 中的 async 和 wait:简洁异步代码的关键

    javascript 的异步特性是其最大的优势之一,但它也可能成为开发人员沮丧的根源。随着时间的推移,我们已经从回调函数(以及可怕的“回调地狱”)转向承诺,现在转向异步和等待。这些现代工具简化了异步编程,使您的代码更具可读性、可维护性和高效性。 但是 async 和 wait 到底如何工作,为什么它…

    2025年12月19日 好文分享
    000
  • 为浏览器构建了一个 cli

    泰尔莫 termo 是一个简单的终端模拟器,可用于在您的网站上创建类似终端的界面。它的灵感来自 stripe.dev 中的终端模拟器。它是 xterm.js 之上的包装器。 演示 查看 演示和文档。 github 特征 [x] 可自定义的终端标题、提示、字体和主题[x] 为终端设置欢迎消息[x] 添…

    2025年12月19日
    000
  • JavaScript 中 setTimeout(, ) 的真正含义是什么? (事件循环解释!)

    settimeout(…, 0ms) 在 javascript 中的真正含义是什么? (事件循环解释!) 好吧,让我们用 0ms 来分解整个 settimeout 的事情。乍一看,你可能会想,“兄弟,0ms 意味着它会立即运行,对吗?”但 javascript 有它自己的氛围,0 毫秒并…

    好文分享 2025年12月19日
    000
  • 来自 Lamao LiveAPI:构建超级便捷的 API 文档(下)

    在我之前的文章中,我分享了一个由兼职学生组成的小团队如何构建 lama2——一个简化 api 收集和执行的工具。 它很快成为我们工作流程的重要组成部分,但随着我们 API 存储库的增长,Lama2 的手动流程开始显示出其局限性。 扩大 Lama2 规模的挑战 刚开始时,我们的团队由五名学生组成,他们…

    2025年12月19日
    000
  • 上下文、Redux 还是组合?

    这篇文章最初发布于2023年2月23日@我的博客页面 我是受到最近科技公司裁员影响的开发人员之一。所以,我开始用 react 面试前端职位。 在其中一家公司,我在反应中遇到了一个经典的道具钻孔问题,并被要求解决它。为了简单起见,给出的问题就像这个: export default function a…

    2025年12月19日
    000
  • 我的新书:面向 Web 开发人员的全栈 AI – 包含折扣代码!阿玛!

    很高兴分享我的新书《web 开发人员的全栈人工智能》,现已通过 manning 的早期访问计划提供。 经过几个月的工作,我整理了一份实用指南,弥合了传统 Web 开发和人工智能集成之间的差距。本书介绍了使用 React、Next.js、Vercel 和 LangChain 将 AI 融入 Web 应…

    2025年12月19日
    000
  • 5 种在 JavaScript 应用程序中使用的最佳 HTML 编辑器

    Web 应用程序需要诸如表单之类的元素来包含信息。在这种情况下,HTML 编辑器对于涉及创建和编辑内容的项目发挥着至关重要的作用。 HTML 编辑器支持诸如文本样式、集成图像和视频媒体以及自定义网站外观等功能。 到 2025 年,有多个代码选项可以在 Web 应用程序中安装文本编辑器。开发人员的另一…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信