memoization
memoization 是指通过缓存函数返回结果来加速函数调用的一种技术。仅当函数是纯函数 时结果才可以被缓存,也就是说,函数不能有任何副作用或输出,也不能依赖任何全局状态
import math
_SIN_MEMOIZED_VALUES = {}
def memoized_sin(x):
if x not in _SIN_MEMOIZED_VALUES:
_SIN_MEMOIZED_VALUES[x] = math.sin(x)
return _SIN_MEMOIZED_VALUES[x]
memoized_sin(1)
memoized_sin(2)
memoized_sin(2)
_SIN_MEMOIZED_VALUES
# {1: 0.8414709848078965, 2: 0.9092974268256817}
LRU
functools 模块提供了一个LRU(Least-Recently-Used)缓存装饰器。限定了缓存的条目数,当缓存的条目数达到最大时会移除最近最少使用的条目
import functools
import math @functools.lru_cache(maxsize=2)
def memoized_sin(x):
return math.sin(x) memoized_sin(2)
memoized_sin.cache_info()
memoized_sin(2)
memoized_sin.cache_info()
memoized_sin(3)
memoized_sin.cache_info()
memoized_sin(4)
memoized_sin.cache_info()
memoized_sin.cache_clear()
memoized_sin.cache_info()
# CacheInfo(hits=0, misses=0, maxsize=2, currsize=0)
memoization的更多相关文章
- 用memoization优化递归算法[JS/PHP实现]
递归函数,通过把一个大而复杂问题简化为许多但规模较小的问题,以同一个相似模式来计算,降低了解题的难度:通过调用自身函数,极大地减少了函数代码量的优点而为开发者喜爱.但因其不断调用自身函数开辟新栈,且大 ...
- javascript高级知识点——memoization
memoization是一种非常有用的优化技术,它缓存特定输入产生的相应结果.这样麻烦的查找和迭代计算可以尽可能的减少. 它基本的思想是针对特定的输入,已经计算过的结果都是通过缓存当中的数据直接返回而 ...
- 一个用于每一天JavaScript示例-使用缓存计算(memoization)为了提高应用程序性能
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 函数式编程 - 函数缓存Memoization
函数式编程风格中有一个"纯函数"的概念,纯函数是一种无副作用的函数,除此之外纯函数还有一个显著的特点:对于同样的输入参数,总是返回同样的结果.在平时的开发过程中,我们也应该尽量把无 ...
- 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)
动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...
- memoization提升递归效率
从开通博客到目前为止,也有一年了,刚开始的写了一篇工作的感想,然后就一直不知道写什么,看园子里的文章实在是很专业,怕自己写的太水.但是,写一些东西总归是好的,于是就当作是记笔记一样,开始写第一篇技术类 ...
- 精读JavaScript模式(六),Memoization模式与函数柯里化的应用
假期就这么结束了!十天假就有三天在路上,真的难受!想想假期除了看了两场电影貌似也没做什么深刻印象的事情.流浪地球,特效还是很赞,不过对于感情的描写还是逃不掉拖沓和尴尬的通病,对于国产科幻还是抱有支持的 ...
- [LeetCode] 329. Longest Increasing Path in a Matrix_Hard tag: Dynamic Programming, DFS, Memoization
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- learn go memoization
package main // 参考文章: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.12.md i ...
随机推荐
- 从tcp的角度看,打开一个网页到底发生了什么
使用wireshark进行抓包分析:新建表达式过滤器,选择协议,字段,匹配方式,应用就能筛选出想要的数据包. 一个示例:(tcp.srcport == 1523 or tcp.dstport == 1 ...
- Linux stress CPU的测试方法
一.stress工具安装:1.获取stress源码安装包(stress-1.0.4.tar.gz)3.解压并安装 [root@localhost /]#cd /tmp/ [root@localhost ...
- vbox 虚拟机添加usb
先装扩展包. vbox 所在的用户组比如要包括当前用户才行. 查看当前用户名:sharl@sharl-laptop:~$ whoamisharl 查看vbox 所在的组:sharl@sharl-lap ...
- css制作tips提示框,气泡框,制作三角形
有时候我们的页面会需要这样的一些提示框或者叫气泡框,运用css,我们可以实现这样的效果. 为了实现上面的效果,我们首先要理解如何制作三角形. 当我们给一个DIV不同颜色的边框的时候,我们可以得到下面的 ...
- Win10系列:UWP界面布局基础5
(2)编写后台代码访问资源 下面通过一个例子来演示如何编写后台代码引用资源.新建一个Windows应用商店的空白应用程序项目,将其命名为AccessResourceApplication,打开项目下的 ...
- centos 安装 composer
1 安装 composer curl -sS https://getcomposer.org/installer | php 2 添加到环境变量 mv co ...
- day22 模块_1
核能来袭--模块 1.简单了解模块 2.Collections 3.Time模块 4.functools 一.初识模块 其实之前写的每一个PY文件都是一个模块 还有一些我们一直在使用的模块 buil ...
- Top k问题的讨论(三种方法的java实现及适用范围)
在很多的笔试和面试中,喜欢考察Top K.下面从自身的经验给出三种实现方式及实用范围. 合并法 这种方法适用于几个数组有序的情况,来求Top k.时间复杂度为O(k*m).(m:为数组的个数).具体实 ...
- 顺便谈谈对于Java程序猿学习当中各个阶段的建议
引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...
- Cracking The Coding Interview 4.7_暂存
//原文: // // You have two very large binary trees: T1, with millions of nodes, and T2, with hundreds ...