gpt4 book ai didi

python - 避免重新计算的方案

转载 作者:太空宇宙 更新时间:2023-11-04 10:11:19 25 4
gpt4 key购买 nike

动机:

为了抽象起见,我有一个处理对象列表的方法。这里我展示了一个简化版本用于说明目的(这里使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com