记忆处理程序[重复]

2023-11-21

创建一个像下面这样可以为您处理记忆过程的类是“好习惯”吗?记忆化的好处是如此之大(在某些情况下,比如这个,它从我的计算机上的 501003 次函数调用减少到 1507 次函数调用,并将 CPU 时间从 1.409 秒减少到 0.006 秒),看起来像这样的类会很有用。

然而,我只读过关于使用的负面评论eval(). 考虑到这种方法提供的灵活性,这种用法是否可以原谅?

这可以自动保存任何返回值,但代价是失去副作用。谢谢。

import cProfile

class Memoizer(object):
    """A handler for saving function results."""
    def __init__(self):
        self.memos = dict()
    def memo(self, string):
        if string in self.memos:
            return self.memos[string]
        else:
            self.memos[string] = eval(string)
            self.memo(string)

def factorial(n):
    assert type(n) == int
    if n == 1:
        return 1
    else:
        return n * factorial(n-1) 

# find the factorial of num
num = 500
# this many times
times = 1000

def factorialTwice():
    factorial(num)
    for x in xrange(0, times):
        factorial(num)
    return factorial(num)

def memoizedFactorial():
    handler = Memoizer()
    for x in xrange(0, times):
        handler.memo("factorial(%d)" % num)
    return handler.memo("factorial(%d)" % num)


cProfile.run('factorialTwice()')

cProfile.run('memoizedFactorial()')

您可以记住,而无需求助于eval.

一个(非常基本的)记忆器:

def memoized(f):
    cache={}
    def ret(*args):
        if args in cache:
            return cache[args]
        else:
            answer=f(*args)
            cache[args]=answer
            return answer
    return ret

@memoized
def fibonacci(n):
    if n==0 or n==1:
        return 1
    else:
        return fibonacci(n-1)+fibonacci(n-2)

print fibonacci(100)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记忆处理程序[重复] 的相关文章

随机推荐

  • 如何卸载Python和所有包

    我希望卸载 Python 2 7 以及与其连接的所有包 我最初从官方网站安装了Python 并使用 pip install 命令安装了所有软件包 从控制面板卸载Python也会自动卸载所有包吗 我之所以要卸载Python 是因为我想使用An
  • 避免在 Kubernetes 中为一个 cron 执行点运行多个 cron 作业

    编辑 问题已解决 这是我的错误 我只是使用了错误的 cron 设置 我假设 2 每天只会在 2 点运行一次 但实际上它在 2 点之后每分钟都会运行一次 因此 Kubernetes 的行为是正确的 我一直在一个 cron 执行点运行多个作业
  • 如何使用 scipy.ndimage.filters.gereric_filter?

    我正在尝试使用 scipy ndimage filters generic filter 来计算邻域的加权和 邻域在某些时候会发生变化 但目前我正在努力实现 3x3 到目前为止 这就是我所在的地方 def Func a a np resha
  • Swift 中的数字四舍五入到小数点后两位

    我得到了一个数字值 我试图将其转换为小数点后两位 但是当我转换它时 结果变为 0 00 数字是这样的0 24612035420731018 当得到它的 2f 值时 它显示 0 00 我尝试过的代码是这样的 let digit FindRes
  • 如何获取外键引用的表

    我有一个小问题 但尚未找到答案 如何在 C 中使用 Microsoft SqlServer Smo 外键列所引用的表 foreach Column column in currentTable Columns if column IsFor
  • 如何压缩两个非连续的提交?

    我对 git 中的整个变基功能有点陌生 假设我做出了以下承诺 A gt B gt C gt D 后来我意识到D包含一个修复程序 该修复程序依赖于添加的一些新代码A 并且这些提交属于一起 我该如何压扁A D一起离开B C alone 你可以运
  • 如何从 LLVM 中的 CallInst 获取间接调用的函数名称

    Function fun call gt getCalledFunction getCalledFunction 如果是间接调用则返回 null 如何获取函数的名称或指针的名称 我发现Stack Overflow中与此问题相关的所有问题都谈
  • 在gradle中使用目标sdk版本23时,ZBAR条码扫描库不工作

    我在我的项目中使用 zbar 扫描仪库 更新到 sdk 23 后 棉花糖扫描仪无法工作 以下是 gradle 文件 扫描仪正在工作 如果我将 targetSdkVersion 设置为 23 以外的任何值 以下是gradle文件 apply
  • 按下按键后防止光标隐藏在浏览器中

    我知道在大多数浏览器 最新一代 中 当您输入 A 或空格等任何键时 鼠标光标会隐藏 这是为了让用户看到他输入的内容 一旦您将鼠标移动一个像素 光标就会恢复可见 现在问题来了 这种情况在浏览器中随处可见 即使我关注的是 div 等非输入元素
  • JavaFX 中需要使用 gradle 来定位

    我越来越 java lang NullPointerException 位置是必需的 当我使用 gradle 和 javafx 插件组装后运行我的程序时 如果我从 IntelliJ Idea 运行它 一切都很好 Java源文件和 fxml位
  • Haskell hoogle 通过 cabal 安装,但未找到 hoogle 命令

    hoogle hoogle 4 2 36 安装过程看起来很成功 除了在命令行输入 hoogle 时 它会抱怨 hoogle 找不到命令 在两台机器上尝试过这个 都运行 MAC OS X Yosemite 它们以完全相同的方式失败 有什么建议
  • 非常大的集合的 SQLAlchemy 集合成员资格

    我的 SQL 查询可以非常简单地写为 result session query Table filter Table my key in key set The my key整数列已建立索引 主键 但是key set确实可能非常大 有数千万
  • Linux (Ubuntu 11.10) 中的 Matlab 在绘图中不显示 Unicode(希伯来语)

    我尝试在 Ubuntu 上的 Matlab 图形图中使用希伯来字符 但没有成功 我试过 text 0 6 0 5 fontname times new roman rotation 180 fontsize 50 color r and t
  • 验证器中的 HTML 开始标记有误?

    我正在尝试验证此 HTML 文档http validator w3 org validate by input但我收到以下错误 第 3 行 第 47 列 杂散开始标记 html 第 4 行 第 47 列 杂散开始标记 html 第 5 行
  • 简短的 IF - ELSE 语句

    我试图使我的代码更具可读性 因此我决定使用一些简短的 IF 语句 这是我的代码 它不起作用 不是声明 jXPanel6 isVisible jXPanel6 setVisible true jXPanel6 setVisible false
  • ElasticSearch:搜索嵌套数组中的字段

    我对 ES 相当陌生 正在将它用于我的一个新项目 首先 我有一个客户的简单映射 其中包含名字和姓氏以及支付信息对象列表 如果我在 SQL 中执行此操作 它将类似于客户表和具有一对多关系的付款信息表 这是我正在尝试做的一个简单示例 https
  • 如何序列化对象以通过网络发送

    我正在尝试仅使用 STL 序列化对象以通过套接字通过网络发送 我没有找到一种方法来保持对象的结构在其他主机中反序列化 我尝试转换为string to char 我花了很长时间在互联网上搜索教程 但到目前为止我什么也没找到 有没有办法只用ST
  • LDA 忽略 n_components?

    当我尝试使用 Scikit Learn 的 LDA 时 它只给我一个组件 尽管我要求更多 gt gt gt from sklearn lda import LDA gt gt gt x np random randn 5 5 gt gt g
  • Python C 扩展 - 为什么使用关键字参数的方法强制转换为 PyCFunction

    我正在学习 Python C 扩展 并且很困惑为什么使用关键字参数的方法必须转换为 PyCFunctions 我对 PyCFunction 的理解是它需要两个指向 PyObjects 的指针并返回一个指向 PyObject 的指针 例如 P
  • 记忆处理程序[重复]

    这个问题在这里已经有答案了 创建一个像下面这样可以为您处理记忆过程的类是 好习惯 吗 记忆化的好处是如此之大 在某些情况下 比如这个 它从我的计算机上的 501003 次函数调用减少到 1507 次函数调用 并将 CPU 时间从 1 409