动机:
为了抽象起见,我有一个处理对象列表的方法。这里我展示了一个简化版本用于说明目的(这里使用 Python2.7):
def foo(obj_lst, f):
return list(map(f, obj_lst))
但是,对于某些情况,输入可能是 foo([obj] * 1000, f)
,那么在函数调用中我必须重新计算 1000 次 f(obj)。我们可能会避免它,因为所有这些都是完全相同的对象。
我的解决方案:
我总是可以缓存计算结果,因为
def foo2(obj_lst, f):
cache_map = {}
def foo_single(obj):
if id(obj) not in cache_map:
cache_map[id(obj)] = f(obj)
return cache_map[id(obj)]
result_lst = []
for obj in obj_lst:
result_lst.append(foo_single(obj))
return result_lst
这正是我想要的工作,它确实可以加快重新计算的开销。
我的问题:
这个解决方案对我来说不够简洁,因为我必须在每个函数中手动这样做,是否有更好的解决方案来避免非随机函数的一般“相同对象重新计算”?具有来自函数 id 和所有参数的键的全局 cache_map 似乎不起作用,因为对象 id 仅在其生命周期内是唯一的。
总的来说,我知道这在 Python 中可能没有太大意义,因为这些对象是可变的。请问在像Scala这样的函数式编程语言中是否有一些现有的方案来处理不可变对象(immutable对象)的这个问题?谢谢!
最佳答案
您正在描述 memoization .
这可以通过 creating your own helper/decorator function 来完成或使用 functools.lru_cache来自标准库(Python 3.2+)
关于python - 避免重新计算的方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38106203/