如何应用functools.lru_cache来使用可变参数进行操作?

时间:2015-07-05 22:46:02

标签: python memoization

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

现有解决方案吗?

1 个答案:

答案 0 :(得分:6)

这样做最简单的方法可能是记住只接受不可变对象的版本。

假设你的函数需要一个np.array,我们假设它是一个1d数组。幸运的是,它很容易翻译成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)