用Python记忆整个块

时间:2014-08-20 20:52:33

标签: python memoization joblib

假设我有一些代码可以创建多个变量:

# Some code

# Beginning of the block to memoize
a = foo()
b = bar()
...
c =
# End of the block to memoize

# ... some more code

我想 memoize 上面的整个块,而不必明确关于块中创建/更改的每个变量或手动腌制它们。我怎么能用Python做到这一点?

理想情况下,我希望能够使用某些内容(if/elsewith语句)来包装它,并且如果需要,可以使用强制刷新的标志。

在概念上说,它会像:

# Some code

# Flag that I can set from outside to save or force a reset of the chache 
refresh_cache = True

if refresh_cache == False
   load_cache_of_block()
else:      
   # Beginning of the block to memoize
   a = foo()
   b = bar()
   ...
   c = stuff()
   # End of the block to memoize

   save_cache_of_block()

# ... some more code

有没有办法做到这一点,而无需明确挑选代码中定义或更改的每个变量? (即在我们保存的第一次运行结束时,我们稍后只重用这些值)

2 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题,但我认为与你所描述的最接近的方式是使用pythons module scope作为你的memoized和{{1}或根据需要import。像这样:

reload

使用"变量范围"作为模块# a.py import b print b.a, b.b b.func(5) b.b = 'world' print b.a, b.b if b.needs_refresh(): reload(b) print b.a, b.b

b

执行此操作会产生您期望的结果:

# b.py
a = 0
b = 'hello'

def func(i):
    global a
    a += i

def needs_refresh():
    return a >= 5

编辑:允许您复制并保存整个范围,您可以使用类范围:

 0 hello
 5 world
 0 hello

答案 1 :(得分:1)

如何使用locals()获取局部变量列表,将它们存储在pickle中的dict中,然后使用(下面更概念化):

for k,v in vars_from_pickle:
  run_string = '%s=%s' % (k,v)
  exec(run_string)

恢复本地堆栈。也许最好使用列表而不是字典来保持堆栈排序。