【问题标题】:How to apply functools.lru_cache to function with mutable parameters?如何将 functools.lru_cache 应用于具有可变参数的功能?
【发布时间】:2015-09-23 00:03:56
【问题描述】:

我有一个函数,其中一个参数为 numpy.ndarray。它是可变的,所以它不能被 lru_cache 缓存。

是否有任何现有的解决方案?

【问题讨论】:

    标签: python memoization


    【解决方案1】:

    可能最简单的方法是记住一个只包含不可变对象的版本。

    假设您的函数采用np.array,假设它是一个一维数组。幸运的是,它很容易被翻译成tuple

    import numpy as np
    
    a = np.array([1, 2, 3, 4])
    >> tuple(a)
    (1, 2, 3, 4)
    

    反之亦然:

    >> np.array(tuple(a))
    array([1, 2, 3, 4])
    

    所以你会得到类似的东西

    # Function called by the rest of your program
    array_foo(a) # `a` is an `np.array`
        ...
        return tuple_foo(tuple(a))
    

    然后记住这个函数:

    # Internal implementation
    @functools.lru_cache
    tuple_foo(t) # `t` is a tuple
        ...
        a = np.array(t)
    

    【讨论】:

    • 是的,我认为这很简单。
    • 不是每次都进行转换就否定了记忆的整体性能提升吗?
    • @endolith 这取决于它节省了什么,不是吗?如果操作在输入中是超线性的(例如反转密集矩阵),则缓存可能会更有效,但对于矩阵的条目求和,不。请注意,即使没有转换,散列输入也是线性的。 YMMV。
    • 另一种可能性是使用 array.tobytes() 将输入与缓存进行比较
    猜你喜欢
    • 1970-01-01
    • 2015-11-08
    • 2016-06-27
    • 2014-07-29
    • 2020-10-02
    • 1970-01-01
    • 2015-04-24
    • 2016-10-22
    相关资源
    最近更新 更多