如何将functools.lru_cache应用于具有可变参数的函数?

11

我有一个函数,其中一个参数是numpy.ndarray。它是可变的,因此无法被lru_cache缓存。

是否有现有的解决方案?

1个回答

6
可能最简单的方法是对只包含不可变对象的版本进行缓存。假设您的功能接受一个np.array,并且假设它是一个1d数组。幸运的是,它可以很容易地转换为元组。
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)

是的,我认为这很简单。 - iuradz
每次进行转换不会抵消记忆化的整体性能提升吗? - endolith
1
@endolith 这取决于它正在保存什么,不是吗?如果操作超线性地依赖于输入(例如反转密集矩阵),可能会更有效地使用缓存,但对于矩阵项的求和则不是这样。请注意,即使没有转换,哈希输入也是线性的。效果因人而异。 - Ami Tavory
另一种可能性是使用array.tobytes()将输入与缓存进行比较。 - endolith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接