2017-02-23 2 views
0

Wenn der gleiche Unterausdruck an mehreren Stellen innerhalb eines Ausdrucks auftritt, wird er mehrfach neu berechnet (oder ist nuxepr clever genug, um dies zu erkennen und das Ergebnis wiederzuverwenden)?numexpr: temporäre Variablen oder wiederholte Sub-Ausdrücke?

Gibt es eine Möglichkeit, temporäre Variablen innerhalb eines NUMEXPR Ausdruck zu deklarieren? Dies hätte zwei Ziele:

  1. ermutigen Sie numexpr, Caching und Wiederverwendung zu berücksichtigen, anstatt das Ergebnis neu zu berechnen;
  2. vereinfachen Sie den Ausdruck (den Quellcode einfacher zu lesen und zu pflegen).

Ich versuche f (g (x)) zu berechnen wo f und g selbst sind beide komplizierte Ausdrücke (zB für pixelbasierte thematische Gliederung, f ist ein verschachtelter Baum Entscheidung mit mehreren Schwellenwerten ist g ein Satz von normalisierten Differenzverhältnissen, und x ist ein Multiband-Rasterbild).

Antwort

0

Ja, wenn ein Unterausdruck innerhalb eines nexxpr-Ausdrucks wiederholt wird, wird er nicht neu berechnet.

Dies kann verifiziert werden, indem numexpr.evaluate(expr) durch numexpr.disassemble(numexpr.NumExpr(expr)) ersetzt wird.

Zum Beispiel kann der Ausdruck "where(x**2 > 0.5, 0, x**2 + 10)" wird in so etwas wie zusammengestellt:

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

(nur die Multiplikation Hinweis erscheint einmal, nicht zweimal.)

Aus diesem Grunde ist es am besten, wenn die gesamte Berechnung kann als einzelne Nummer eingegeben werden. Vermeiden Sie die Durchführung von Unterberechnungen in Python (Zuweisung von Zwischenergebnissen oder temporären Variablen zu numply arrays), da dies nur die Speichernutzung erhöht und die Optimierungen/Beschleunigungen von nexxpr beeinträchtigt (die sich darauf beziehen, diese vollständige Abfolge von Berechnungen in CPU-Cache-Blöcken auszuführen) Speicherlatenz).

Dennoch lesbarer Code kann durch die Verwendung Zeichenfolge Substitution formatiert werden:

f = """where({g} > 0.5, 
      0, 
      {g} + 10)""" 
g = "x**2" 
expr = f.format(g=g) 
Verwandte Themen