0

2 つの確率変数の確率密度関数func1func2(それぞれの を含む) があります。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>' [...]

このような動的に生成された関数をキャッシュするためのより良いアプローチは何ですか?

4

1 に答える 1

2

使えfunctools.lru_cacheますか? https://docs.python.org/3/library/functools.html#functools.lru_cache . すべてメモリ内にあるため、プログラムを再起動するたびに値が失われますが、キャッシュはウォームアップします。

functools import 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
于 2016-05-17T15:21:54.823 に答える