Условие, Блок, Модуль - какой способ наиболее эффективен с точки зрения памяти и вычислений?

Всегда есть несколько способов сделать то же самое в Mathematica . Например, при адаптации решения WReach для моей недавней проблемы я использовал Условие :

ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] /; (Unset[done]; True) := 
 Internal`WithLocalSettings[Null, done = f[expr], 
  AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]; Unset[done]]]

Однако мы можем сделать то же самое с Блоком :

ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] := 
 Block[{done}, 
  Internal`WithLocalSettings[Null, done = f[expr], 
   AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]]]]

Или с Модуль :

ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] := 
 Module[{done}, 
  Internal`WithLocalSettings[Null, done = f[expr], 
   AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]]]]

Возможно, есть несколько других способов сделать то же самое. Какой способ наиболее эффективен с точки зрения использования памяти и ЦП ( f может возвращать очень большие массивы данных, но может возвращать очень маленькие)?

13
задан Community 23 May 2017 в 11:55
поделиться