python - 避免重新计算的方案

标签 python performance scala

动机:

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

相关文章:

python - 带有预装依赖项的 pip 包安装

python - 请求异常.HTTPError : 401 Client Error atlassian-python-api

java - 如何将 Java Servlet 与 Play 框架 Web 套接字混合?

python - OpenCV VideoWriter ffmpeg 一次又一次

python - Django 只加载一次对象实例,使它们在启动应用程序时可用

使用 clone_from_slice() 而不是 copy_from_slice() 的性能损失?

mysql - 左连接对多列性能的影响?

MySQL:具有许多连接的慢查询

java - 我可以读取 cassandra 中一个单元的所有版本吗?

regex - 使用 Scala 模式匹配时工作正则表达式失败