2017-02-23 24 views
0

Если одно и то же подвыражение появляется в нескольких местах в пределах одного выражения numexpr, будет ли оно пересчитываться несколько раз (или оно достаточно велико, чтобы обнаружить это и повторно использовать результат)?numexpr: временные переменные или повторяющиеся подвыражения?

Есть ли способ объявить временные переменные в выражении numexpr? Это имело бы две цели:

  1. поощрять numexpr рассматривать кеширование и повторное использование, а не пересчет результата;
  2. упростить выражение (упростить чтение и обслуживание исходного кода).

Я пытаюсь вычислить п (г (х)) где е и г сами как сложные выражения (например, для пикселя на основе тематической классификации, е является вложенным дерево решений с несколькими порогами, g представляет собой набор нормированных разностных отношений, а x - многодиапазонное растровое изображение).

ответ

0

Да, если под выражением 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 

(Обратите внимание на умножение появляется только один раз, а не в два раз.)

По этой причине, лучше всего, если все вычисления может быть введено как одно numexpression. Избегайте выполнения подвычислений в python (назначение промежуточных результатов или временных переменных в массивы numpy), поскольку это только увеличит использование памяти и поднимет оптимизацию/ускорение numexpr (которые связаны с выполнением этой полной последовательности вычислений в кубах размером с процессорный кэш, чтобы избежать латентность памяти).

Тем не менее, более читаемый код может быть отформатирован с помощью подстановки строк:

f = """where({g} > 0.5, 
      0, 
      {g} + 10)""" 
g = "x**2" 
expr = f.format(g=g) 
Смежные вопросы