3

指定されたパラメーターから辞書を作成する方法を考えてみましょう。

def newDict(a,b,c,d): # in reality this method is a bit more complex, I've just shortened for the sake of simplicity
    return { "x": a,
             "y": b,
             "z": c,
             "t": d }

そして、実行されるたびに newDict メソッドを呼び出す別のメソッドがあります。したがって、最後に cProfiler を見ると、次のようになります。

17874 calls (17868 primitive) 0.076 CPU seconds

もちろん、私の newDict メソッドは1785times と呼ばれます。さて、私の質問は、呼び出し時間を短縮するために newDict メソッドを記憶できるかどうかです。(念のため、関数の記憶に影響があるかどうかはわかりませんが、変数はほぼすべての呼び出しで変更されます)

サブ質問: 17k コールは多すぎると思います。コードは効率的ではありません。しかし、統計を見て、これが通常の結果なのか、それとも呼び出しが多すぎてコードが遅いのかを述べていただけますか?

4

3 に答える 3

9
  1. あなたはそうではmemoizeないという意味memorizeです。
  2. ほとんどの場合、値が異なる場合、メモ化しても効果がなく、処理速度が低下します。
  3. あなたの完全なコードを見て、それが何をすべきかを知らなくても、17kの呼び出しが多いか少ないかをどうやって知ることができますか?
于 2011-08-16T12:04:14.363 に答える
8

メモ化することでメモ化することを意味する場合は、を使用しますfunctools.lru_cache。関数デコレータです

于 2011-08-16T12:01:12.537 に答える
2

メモ化の目的は、実行するのに費用がかかる操作の結果を保存して、操作を繰り返して繰り返し費用を負担することなく、2 回目、3 回目などの時間を提供できるようにすることです。

メモ化は通常、(a) 負荷の高い操作を実行する、(b) 同じ引数を指定すると常に同じ結果を生成する、(c) プログラムの状態に副作用がない関数に適用されます。

メモ化は通常、その結果を生成した引数の値とともに結果を「保存」することにより、そのような関数内で実装されます。これは、キャッシュの一般概念の特殊な形式です。関数が呼び出されるたびに、関数はメモ キャッシュをチェックして、引数の現在の値に適した結果が既に決定されているかどうかを確認します。キャッシュに結果が含まれている場合は、再計算する必要なく返すことができます。

あなたの関数は、呼び出されるたびに新しい辞書を作成することを意図しているようです。この関数をメモ化するための賢明な方法はないようです: 受信した辞書の使用が関数への他の呼び出しに干渉しないように、常に新しい辞書を呼び出し元に返す必要があります。

メモ化を使用して視覚化できる唯一の方法は、(1) 結果に配置された 1 つ以上の値の計算が高価である場合です (その場合、おそらく値を計算する関数を定義し、その関数をメモ化します) または ( 2) newDict 関数は、特定の引数値のセットを指定して、同じ値のコレクションを返すことを目的としています。後者の場合、私は dict を使用せず、代わりに変更不可能なオブジェクトを使用します (たとえば、dict のようなクラスですが、その内容の変更に対する保護を備えています)。

サブ質問に関して、質問する必要があるのは、(1) newDict が適切に呼び出される回数と、(2) newDict の各実行の実行時間を短縮できるかということです。これらは、必要に応じて個別に対処する必要がある 2 つの別個の独立した質問です。

ところで、あなたの関数定義にはタイプミスがあります - return は return キーワードと開き括弧の間に「d」があってはなりません。

于 2012-10-09T17:18:22.803 に答える