3

OpenDocument 数式構文を使用する数式を取得し、変数を評価せずに Python が理解できる構文に解析し、変数の値を変更して数式を何度も評価できるようにする必要があります。式はユーザー入力になる可能性があるため、pyparse を使用すると、式の構文を効果的に処理し、ユーザー入力をきれいにすることができます。利用可能なpyparsingの良い例はたくさんありますが、数学的なものはすべて、現在のスコープ内のすべてをすぐに評価することを前提としているようです.

コンテキストとして、私は産業経済 (ライフ サイクル アセスメント、または LCA) のモデルを使用しています。これらの式は、プロセス間の物質またはエネルギー交換の量を表しています。変数の量は、地理的な場所など、いくつかのパラメーターの関数にすることができます。式の連鎖と変数参照は有向非巡回グラフに格納されるため、式は常に簡単に評価できます。式はデータベースに文字列として保存されます。私の質問は次のとおりです。

  1. 解析された評価をデータベースに保存できるように式を解析することは可能ですか (評価される文字列などとして)?
  2. このアプローチに代わるものはありますか? 理想的な解決策は、一度解析/書き込みを行い、何度も読み取ることです。たとえば、数式を部分的に解析してから ast モジュールを使用しますが、これがデータベース ストレージでどのように機能するかはわかりません。
  3. これに似たプロジェクトまたはライブラリの例で、私が調べることができるものはありますか? 私はプログラマーではなく、空き時間にオープンソースの LCA ソフトウェア モデルを作成しながら論文を完成させようとしている学生です。
  4. このアプローチは遅すぎますか?各実行には数万回の数式評価が含まれる可能性がある、実質的なモンテカルロ実行を実行できるようにしたいと考えています (これは大きなデータベースです)。
4

1 に答える 1

4

1) はい、式を解析した結果をピクルしてデータベースに保存することができます。次に、元の式を再度解析するのではなく、式を取得して unpickle するだけです。

2) 次の対話型セッションのように、compile および eval ビルトインを使用するだけで、簡単なパスを実行できます。

>>> y = compile("m*x+b","","eval")
>>> m = 100
>>> x = 5
>>> b = 1
>>> eval(y)
501

もちろん、これには、信頼されていない、または悪意のあるソース文字列が有害なシステム コールを埋め込む可能性があるという点で、評価ベースまたは実行ベースの実装のセキュリティ上の落とし穴があります。しかし、これがあなたの論文であり、完全にあなたの管理範囲内にある場合は、愚かなことをしないでください.

3) pyparsing wiki の Examples ページで、式を解析して「評価可能な」データ構造にするオンラインの例を入手できます。特にsimpleBool.pyevalArith.pyをチェックしてください。気分が悪い場合は、Python マガジンの2008 年 5 月号のバックナンバーを注文してください。そこには、私の記事「Pyparsing を使用した単純なインタープリター/コンパイラーの作成」があり、使用されているメソッドの詳細な説明と、その方法の説明が含まれています。パースされた結果のピクルス化とアンピクルス化は機能します。

4)遅い部分は解析であるため、これらの結果を中間的で繰り返し評価可能な形式で保存することで正しい軌道に乗っています。eval 部分はかなりきびきびしているはずです。2番目に遅い部分は、データベースからこれらのピクルされた構造を取得することです。MC の実行中に、式の選択パラメーターを取得し、データベースからフェッチし、ピクルを解除して評価可能な式を返す単一の関数をパッケージ化します。次に、これが機能したら、memoize デコレータを使用してこれらのクエリと結果のペアをキャッシュし、特定の式を 1 回フェッチ/アンピクルするだけで済むようにします。

あなたの論文で頑張ってください!

于 2009-12-17T13:31:06.637 に答える