2

同じサブ式が 1 つのnumexpr 式内の複数の場所にある場合、複数回再計算されますか (または numexpr はこれを検出して結果を再利用するのに十分賢いですか)?

numexpr 式内で一時変数を宣言する方法はありますか? これには 2 つの目的があります。

  1. numexpr が結果を再計算するのではなく、キャッシュして再利用することを検討することを奨励します。
  2. 式を単純化します (ソース コードを読みやすく、保守しやすくします)。

f(g(x))を計算しようとしています。ここで、fgはどちらも複雑な式です (たとえば、ピクセルベースの主題分類の場合、fは複数のしきい値を含むネストされた決定木であり、gは正規化された差分比のセットであり、xはマルチバンド ラスター イメージです)。

4

1 に答える 1

3

はい、サブ式が numexpr 式内で繰り返される場合、再計算されません。

numexpr.evaluate(expr)に置き換えることで確認できますnumexpr.disassemble(numexpr.NumExpr(expr))

たとえば、式"where(x**2 > 0.5, 0, x**2 + 10)"は次のようにコンパイルされます。

y = x*x
t = y>0.5
y = y+10
y[t] = 0

(乗算は 2 回ではなく、1 回だけ表示されることに注意してください。)

このため、計算全体を 1 つの numexpression として入力できることが最善です。Python で部分計算を実行する (中間結果または一時変数を numpy 配列に割り当てる) ことは避けてください。これはメモリ使用量を増加させるだけであり、numexpr の最適化/スピードアップを損なうだけです (これは、回避するために CPU キャッシュ サイズのチャンクでこの完全な計算シーケンスを実行することに関連しています)。メモリレイテンシ)。

それにもかかわらず、より読みやすいコードは、文字列置換を使用してフォーマットできます。

f = """where({g} > 0.5,
             0,
             {g} + 10)"""
g = "x**2"
expr = f.format(g=g)
于 2017-02-23T04:58:24.320 に答える