我该如何腌制“a”;备忘录;Python函数?

我该如何腌制“a”;备忘录;Python函数?,python,query-optimization,dill,Python,Query Optimization,Dill,我有以下代码: def f(input,MEM={}): if len(MEM) == 0: with open('dill.pkl', 'rb') as f: MEM = dill.load(f) if input not in MEM: intended_output = complex_function(input) MEM[input] = intended_output return MEM

我有以下代码:

def f(input,MEM={}):
    if len(MEM) == 0:
        with open('dill.pkl', 'rb') as f:
            MEM = dill.load(f)
    if input not in MEM:
        intended_output = complex_function(input)
        MEM[input] = intended_output
    return MEM[input]
运行长批输入时,我发现我的代码运行速度比我最初没有加载
MEM
时慢得多。例如,与

def f(input,MEM={}):
    if len(MEM) == -1:
        return None
    if input not in MEM:
        intended_output = complex_function(input)
        MEM[input] = intended_output
    return MEM[input]
我运行
f
f2
进行了4000次输入,完成
f
需要半小时,但完成
f2
只需要40秒。这是因为当我用dill加载
MEM
时,它由访问速度较慢的结构表示吗?我尝试过复制和deepcopying MEM,这只会使问题变得更糟(尤其是使用deepcopy时,即使是较小的输入也需要几秒钟)

  • 只有一次或更少的腌制才有意义

  • 在许多情况下运行函数时,最好避免循环,而是使用利用C代码的.apply等函数

  • 也许您可以并行化,这样您就可以使用所有的内核来完成任务。也许这有助于:

  • 只有一次或更少的腌制才有意义

  • 在许多情况下运行函数时,最好避免循环,而是使用利用C代码的.apply等函数

  • 也许您可以并行化,这样您就可以使用所有的内核来完成任务。也许这有助于:

  • 这将创建一个名为
    MEM
    的新局部变量,但不会更改默认参数
    MEM

    因此,默认参数
    MEM
    是一个空字典,每次调用函数时都会取消对文件的勾选

    要实际更改默认参数,只需使用:

    MEM.update(dill.load(...))
    

    这将创建一个名为
    MEM
    的新局部变量,但不会更改默认参数
    MEM

    因此,默认参数
    MEM
    是一个空字典,每次调用函数时都会取消对文件的勾选

    要实际更改默认参数,只需使用:

    MEM.update(dill.load(...))
    


    请参阅。

    不确定是否与问题有关,但(1)如果将
    与open(…)
    一起使用,则不需要
    f.close()
    ;(2) 你根本没有使用
    f
    !?哎呀,我的意思是写
    MEM=dump(f)
    。我不知道
    f.close()
    没有必要,我现在也改变了。不幸的是,这并没有显著改变我代码的速度。如果你想添加自己的答案,请将其添加为答案,而不是将其编辑到问题中。我是
    dill
    的作者。您可能想查看
    klepot
    如何使用
    dill
    klepto
    是一个缓存库,它利用
    dill
    来帮助记忆。不确定是否与问题有关,但是(1)如果使用
    打开(…)
    ,则不需要
    f.close()
    ;(2) 你根本没有使用
    f
    !?哎呀,我的意思是写
    MEM=dump(f)
    。我不知道
    f.close()
    没有必要,我现在也改变了。不幸的是,这并没有显著改变我代码的速度。如果你想添加自己的答案,请将其添加为答案,而不是将其编辑到问题中。我是
    dill
    的作者。您可能想查看
    klepot
    如何使用
    dill
    klepot
    是一个缓存库,它利用
    dill
    来帮助记忆。我知道for循环不是主要问题。我在
    f2
    中包含了dummy for循环,它运行速度令人满意。关于第(1)项,我如何只解腌菜一次?我对dill很陌生。也许你可以在函数外和开始时取消选择。我的意思是,第一个if语句只会正确一次。因此,我不认为这是有用的。。。哦,除非这可能导致每次调用后都无法保存
    MEM
    !好的,事实上我现在明白了。我知道for循环不是主要问题。我在
    f2
    中包含了dummy for循环,它运行速度令人满意。关于第(1)项,我如何只解腌菜一次?我对dill很陌生。也许你可以在函数外和开始时取消选择。我的意思是,第一个if语句只会正确一次。因此,我不认为这是有用的。。。哦,除非这可能导致每次调用后都无法保存
    MEM
    !好吧,事实上我现在明白了。