私を知っている人は、私の記憶力がまったくクソであることを知っています。モンティ・パイソンのダイアログと 90 年代のオルタナティブ ロック バンドのトラックリスト以外のものはすべて、私には完全に権利がありません。 しかし、私たちにとって幸いなことに、物事を記憶するという点では、コンピューターの方がはるかに優れています。
今日取り上げる手法はメモ化と呼ばれます。純粋関数について説明することから始めましょう。純粋関数の背後にある考え方は、どのような入力を与えても、常に同じ出力が得られるということです。ここで、プロセス集約型の関数や、多くのオーバーヘッドを必要とする関数があるかどうかを考えてみましょう。特定のパラメーターのセットを指定したときに関数を実行した結果がすでにわかっている場合、リソースを利用して関数を再実行する必要はありません。メモ化により、関数のパラメーターをキーとして使用して、関数の以前の実行結果を保存できます。次のコード スニペットは、メモ化された関数がどのようなものかを示しています。
const memoize = {}; const getResult = async (n1, n2) => { const key = `${n1}_${n2}`; if (!memoize[key]) { memoize[key] = await resourceIntensiveFunction(n1, n2); } return memoize[key]; };
コードを見てみましょう。まず、memoize というオブジェクトから始めます。このオブジェクトは、パラメーターと結果をキー値セットとして保存します。次に、2 つのパラメータ n1 と n2 を取る getResult という関数があります。話を簡単にするために、順序が重要であると仮定しましょう。 2 つのパラメータを連結して変数キーを作成します。
ここで、memoize オブジェクトにそのキーの値が含まれているかどうかを確認する必要があります。チェックして、そうでない場合は、リソースを大量に消費する機能を実行するしかありません。関数を実行する場合は、将来の実行のために結果をメモ化オブジェクトに保存する必要もあります。こうすることで、次回同じパラメータに対してこの関数を実行するときに、オブジェクト内の結果が検索され、リソースを大量に消費する関数がスキップされます。
これはさまざまなシナリオで役立ちます。たとえば、膨大な時間とリソースを必要とする長い一連の計算がある場合、これは価値のある最適化となります。また、高いネットワーク スループットや大量の一時ディスク領域を必要とするものがある場合にも役立ちます。これらのシナリオのいずれにおいても、利点は 2 つあります。以前に実行された関数を実行する必要がなくなり、すでにマップされている関数とリソースを競合しないため、計算が必要な関数のためにリソースが解放されます。 .
状況によってはこれが適切なアプローチではない可能性があるため、常にこのパラダイムを使用しないでください。関数が純粋な関数ではなく、外部要因に基づいて変化する場合は、他の変数を考慮せずに最初の実行時の値が常に得られるため、このアプローチは使用しないでください。また、アプリケーションが同じパラメーターのセットを使用して関数を実行することがほとんどない場合は、これを使用したくないでしょう。その場合、めったに使用されないデータ構造がますます大きくなるでしょう。
メモ化についてはこれでほぼ終わりです。これは、非常に威圧的な響きの名前を持つ、非常に単純なパターンです。これには多くのアプリケーションがあり、内部で何が起こっているのかをよりよく理解できるようになれば幸いです。さて、すみませんが、今晩何をしようとしていたかを思い出さなければなりません。
ソースコードは GitHub で入手可能
以上がメモライズをありがとうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。