缓存动态生成的函数
Cache dynamically generated functions
我有两个随机变量的概率密度函数func1
和func2
(包括每个的support
)。现在我需要这两个随机变量之和的概率密度函数,我通过以下方式创建:
import numpy as np
import scipy.integrate
[...]
def density_add(func1, func2, support):
return np.vectorize(lambda xi: scipy.integrate.simps(func1(support) * func2(xi-support), support))
问题是巨大的冗余。许多值必须计算多次。所以我尝试缓存,但由于动态生成的函数没有唯一名称而出现问题。
from joblib import Memory
mem = Memory(cachedir="/tmp/joblib", verbose=0)
[...]
def density_add(func1, func2, support):
return np.vectorize(mem.cache(lambda xi: scipy.integrate.simps(func1(support) * func2(xi-support), support))
/usr/lib/python3/dist-packages/numpy/lib/function_base.py:2232: JobLibCollisionWarning: Cannot detect name collisions for function '<lambda> [...]
/usr/lib/python3/dist-packages/numpy/lib/function_base.py:2232: JobLibCollisionWarning: Possible name collisions between functions '<lambda>' [...]
缓存此类动态生成的函数的更好方法是什么?
可以使用functools.lru_cache
吗? https://docs.python.org/3/library/functools.html#functools.lru_cache。它将全部在内存中,因此您会在程序重新启动之间丢失值,但缓存会预热。
从 functools 导入 lru_cache
lru_cache作为装饰者
>>> @lru_cache()
>>> def myfunc(x):
>>> print('sleeping')
>>> return x + 1
>>> myfunc(1)
sleeping
2
>>> myfunc(1)
2
lru_cache 作为函数
>>> myfunc2 = lru_cache()(lambda x: myfunc(x) *2)
>>> myfunc2(2)
sleeping
6
>>> myfunc2(2)
6
我有两个随机变量的概率密度函数func1
和func2
(包括每个的support
)。现在我需要这两个随机变量之和的概率密度函数,我通过以下方式创建:
import numpy as np
import scipy.integrate
[...]
def density_add(func1, func2, support):
return np.vectorize(lambda xi: scipy.integrate.simps(func1(support) * func2(xi-support), support))
问题是巨大的冗余。许多值必须计算多次。所以我尝试缓存,但由于动态生成的函数没有唯一名称而出现问题。
from joblib import Memory
mem = Memory(cachedir="/tmp/joblib", verbose=0)
[...]
def density_add(func1, func2, support):
return np.vectorize(mem.cache(lambda xi: scipy.integrate.simps(func1(support) * func2(xi-support), support))
/usr/lib/python3/dist-packages/numpy/lib/function_base.py:2232: JobLibCollisionWarning: Cannot detect name collisions for function '<lambda> [...]
/usr/lib/python3/dist-packages/numpy/lib/function_base.py:2232: JobLibCollisionWarning: Possible name collisions between functions '<lambda>' [...]
缓存此类动态生成的函数的更好方法是什么?
可以使用functools.lru_cache
吗? https://docs.python.org/3/library/functools.html#functools.lru_cache。它将全部在内存中,因此您会在程序重新启动之间丢失值,但缓存会预热。
从 functools 导入 lru_cache
lru_cache作为装饰者
>>> @lru_cache()
>>> def myfunc(x):
>>> print('sleeping')
>>> return x + 1
>>> myfunc(1)
sleeping
2
>>> myfunc(1)
2
lru_cache 作为函数
>>> myfunc2 = lru_cache()(lambda x: myfunc(x) *2)
>>> myfunc2(2)
sleeping
6
>>> myfunc2(2)
6