問題タブ [memoization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
8 に答える
4801 参照

recursion - Clojureでメモ化された再帰関数を生成するにはどうすればよいですか?

メモ化された再帰関数をClojureで返す関数を作成しようとしていますが、再帰関数に独自のメモ化されたバインディングを表示させるのに問題があります。これは、varが作成されていないためですか?また、letで作成したローカルバインディングでメモ化を使用できないのはなぜですか?

特定の番号で始まるこの少し珍しいフィボナッチ数列メーカーは、私がしたいことの例です。

使用with-local-varsすることは正しいアプローチのように思えますが、それは私にとってもうまくいきません。私は変数を閉じることができないと思いますか?

もちろん、閉じたアトムを作成してメモ化を自分で管理するマクロを手動で作成することもできますが、そのようなハッカーなしでこれを実行したいと考えていました。

0 投票する
5 に答える
5224 参照

java - Java: 自動メモ化

私のコードには、メモ化を使用することが非常に理にかなっている (必須でさえあるように思える) いくつかの関数があります。

関数ごとに個別に手動で実装したくありません。何らかの方法がありますか (たとえば、 Python のように)、注釈を使用するか、他のことを行うことができるので、必要な関数でこれを自動的に取得できますか?

0 投票する
4 に答える
11074 参照

haskell - GHC Haskellでメモ化が自動化されるのはいつですか?

m2が次のようになっていないのに、なぜm1が明らかにメモ化されているのか理解できません。

m1 10000000は最初の呼び出しで約1.5秒かかり、後続の呼び出しではその一部(おそらくリストをキャッシュします)ですが、m2 10000000は常に同じ時間かかります(呼び出しごとにリストを再構築します)。何が起こっているのか分かりますか?GHCが機能をメモ化するかどうか、いつメモ化するかについての目安はありますか?ありがとう。

0 投票する
3 に答える
376 参照

ruby-on-rails - Railsはブラウザのリクエスト間で事前計算された値をキャッシュできませんか? (n 個の階乗結果を記憶するなど)

たとえば、次のコード:

複数回ロードlocalhost:3000/foosすると、異なる値が表示されます。これが開発モードであっても、ブラウザー リクエストが来るたびに Rails がコントローラー (およびモデルとビュー) をリロードするため、驚くことではありません。

しかし、本番モードであっても、すべてがロードされてそこにとどまっている場合、@fooの値はブラウザのリクエスト間で維持されませんか? Web ブラウザでページをリロードするたびに、異なる番号が表示されます。では、Rails は毎回すべての値を消去しますか? DBMS を使用しない場合、リクエスト全体で結果をキャッシュまたは「メモ化」する方法はありますか?


驚いたことに、クラス変数を使用してみましたが、開発モードでは毎回異なる番号が返されます。実稼働モードでは、Firefox の数値は同じままで、サーバーが再起動されるまで、Chrome にも常にその数値が表示されます。

クラス変数はメモ化できるのに、インスタンス変数はメモ化できないのはなぜですか? クラス変数を使用することは、Rails 2.x、3.x、および Ruby 1.8.7 と 1.9.2 で確実にリクエスト全体で「物事を記憶する」ための信頼できる方法ですか?

0 投票する
10 に答える
50913 参照

python - Python でのクラス属性のキャッシュ

私はPythonでクラスを書いていますが、計算に比較的時間がかかる属性があるので、一度だけやりたいです。また、クラスのすべてのインスタンスで必要になるわけではないため、デフォルトでは__init__.

私はPythonは初めてですが、プログラミングは初めてです。これを非常に簡単に行う方法を思いつくことができますが、何かを行う「Pythonic」の方法は、他の言語での経験を使用して思いつく方法よりもはるかに簡単であることが多いことに何度も気づきました。

Pythonでこれを行う「正しい」方法はありますか?

0 投票する
3 に答える
5971 参照

python - Pythonのリセット可能なインスタンスメソッドのメモ化デコレータ

結果をメモするクラスのインスタンス メソッドのデコレータを構築しようとしています。(これは以前に 100 万回行われています) ただし、メモ化されたキャッシュをいつでもリセットできるオプションが欲しいです (たとえば、インスタンスの状態が変化した場合、何もないメソッドの結果が変わる可能性があります)。その引数を処理する)。そこで、クラス メンバーとしてキャッシュにアクセスできるように、関数ではなくクラスとしてデコレータを構築しようとしました。これにより、記述子、特にメソッドについて学習する道をたどりましたが、__get__実際に行き詰まっているところです。私のコードは次のようになります。

これは明確ですか、および/または可能ですか? が呼び出されるたび__get__に、メモ化されたクラスの新しいインスタンスを取得します。これにより、実際のデータを含むキャッシュが失われます。私は と懸命に取り組んできましたが__get__、あまり進歩していません。

私が完全に見逃しているこの問題に対する完全に別のアプローチはありますか? そして、すべてのアドバイス/提案は大歓迎です。ありがとう。

0 投票する
4 に答える
5127 参照

python - Python ジェネレーターをメモ化できますか?

runqueryデータベースを呼び出してから行を 1 つずつ生成するという関数があります。memoize デコレータを作成しました (または、より正確には、この stackoverflow questionから 1 つ盗みました) が、その後の呼び出しでは、おそらくジェネレータの値を 1 回しか生成できないため、空のシーケンスが生成されます。

Python ジェネレーターで機能するメモ化デコレーターを変更するにはどうすればよいですか? ある時点でメモリに保存する必要があることはわかっていますが、これをデコレータ内で処理し、元の関数を変更したくありません。

メモ化関数の現在のコードは次のとおりです。

0 投票する
2 に答える
352 参照

c# - このメモ化コードから重複をリファクタリングして削除する

このコードからいくつかの重複を削除し、より多くのパラメーターを持つ関数を簡単にサポートできるようにしようとしています。

このコードをどのように改善し、より複雑な機能を可能にしますか?

また、キーの生成が心配です。一部のオブジェクトは文字列に明確にシリアル化されず、一意の値ではなく、タイプ名を返すだけです。提案?

編集:私はChaosPandionの答えを使用しました、そしてそれをこれに落とし込みました

0 投票する
6 に答える
15553 参照

python - Python-ハッシュ化できない引数を処理できるメモ化デコレータを持っている人はいますか?

私は次のメモ化デコレータを使用しています(すばらしい本Python Algorithmsから:Python言語で基本的なアルゴリズムをマスターする...それが大好きです、ところで)。

このデコレータの問題は、辞書ベースのキャッシュが、すべての引数がハッシュ可能でなければならないことを意味することです。

ハッシュ化できない引数(辞書など)を可能にする実装(またはこれを微調整)を持っている人はいますか?

ハッシュ値がないということは、「これはキャッシュにあるのか」という問題を意味することを私は知っています。自明ではなくなりますが、私はただ尋ねると思いました。

===コンテキストを与えるために編集===

モジュールのディクショナリを指定して、Parnasスタイルの「階層を使用」を返す関数に取り組んでいます:依存関係。設定は次のとおりです。

となることによって:

_levelは、このセットアップをよりスケーラブルにするためにメモ化したい関数です。メモ化せずに実装すると、依存関係のレベルが複数回計算されます(たとえば、「a」は上記の例では8回計算されます)。

ありがとう、

マイク

0 投票する
2 に答える
539 参照

ruby - Rubyでバグを引き起こすメモ化を回避するにはどうすればよいですか?

ミュータブルな状態によるバグの原因となるメモ化を回避する方法についてコンセンサスはありますか?

この例では、キャッシュされた結果の状態が変更されたため、2 回目に呼び出されたときに間違った結果が返されました。

これを回避するために私が見ることができるアプローチは次のとおりです。

  1. greetingdupまたはcloneのを返すことができます@greeting_cache[formality]
  2. greetingfreezeの結果でした@greeting_cache[formality]memoization_mutatorこれにより、文字列を追加するときに例外が発生します。
  3. の結果を使用するすべてのコードをチェックしてgreeting、文字列の変更を行っていないことを確認してください。

最善のアプローチについてコンセンサスはありますか? (1) または (2) を行うことの唯一の欠点は、パフォーマンスの低下ですか? (また、他のオブジェクトへの参照がある場合、オブジェクトの凍結が完全に機能しない可能性があると思います)

補足: この問題は、メモ化のメイン アプリケーションには影響しませんFixnum。:)