1

多くの入力パラメータを持つ複雑な数学関数があるとしますP = [p1, ..., pn]。関数をブロック単位で因数分解できるとします。たとえば、次のようになります。

f(P) = f1(p1, p2) * f2(p2, ... pn)

そして多分

f2(p2, ..., pn) = p2 * f3(p4) + f4(p5, ..., pn)

fの多くの値を評価する必要があるとします。Pたとえば、 の最小値を見つけたいとしますf。すでに計算済みで、 where is equal to except forf(P)を計算する必要があるとします。この場合、を再計算する必要はありません。f(P')P'Pp1f2, f3, f4f1

この種のキャッシング システムを実装するのに役立つライブラリはありますか? RooFitは知っていますが、ブロックで作成された統計モデル向けです。もっと一般的なものを探しています。scipy / scikits などが推奨されますが、c++ ライブラリも問題ありません。この技に名前はありますか?

4

1 に答える 1

4

これらの関数を純粋な関数として記述できる場合 (つまり、同じ引数に対して常に同じ値を返し、副作用がないことを意味します)、関数呼び出しの結果を保存する方法であるメモ化を使用できます。

try:
    from functools import lru_cache  # Python 3.2+
except ImportError:  # Python 2
    # Python 2 and Python 3.0-3.1
    # Requires the third-party functools32 package
    from functools32 import lru_cache

@lru_cache(maxsize=None)
def f(arg):
    # expensive operations
    return result

x = f('arg that will take 10 seconds')  # takes 10 seconds
y = f('arg that will take 10 seconds')  # virtually instant

functools32説明のため、またはPython < 3.2 で使用したくない場合:

def memoize(func):
    memo = {}

    def wrapper(*args):
        if args not in memo:            
            memo[args] = func(*args)
        return memo[args]

    return helper

@memoize
def f(arg):
    # expensive operations
    return result

x = f('arg that will take 10 seconds')  # takes 10 seconds
y = f('arg that will take 10 seconds')  # virtually instant
于 2015-08-10T23:16:55.557 に答える