Есть ли проблемы с производительностью при определении модулей как части выражения Manipulate по сравнению с разделом инициализации?

Я хотел бы спросить, знает ли кто-нибудь о каких-либо проблемах (производительности или других), если нужно определить / поставить модуль (ы), используемый выражением Manipulate, прямо внутри самого выражения Manipulate, а не в разделе инициализации, где это обычно делается.

Оба метода работают, но семантика не одинакова, когда дело доходит до прямого доступа к Manipulate Dynamics из модуля (по сравнению с их передачей в качестве аргументов модулю, что на самом деле является лучшим методом, но я пробую кое-что now)

Я не знаю, как эти вещи реализованы, но меня беспокоит, что если я помещу все модули в выражение Manipulate, то Manipulate будет замедляться, когда там много модулей, поскольку каждый раз его нужно обновлять выражение, Mathematica FE отправит ядру теперь гораздо более крупное выражение для переоценки / синтаксического анализа или любого другого правильного термина.

Обновляемое выражение Manipulate теперь намного больше, поскольку модули теперь являются частью самого выражения Manipulate, а не находятся в секции инициализации, и это происходит, даже если некоторые из них могут не вызываться при каждом обновлении.

Чтобы лучше объяснить вопрос, я сделал небольшую диаграмму ниже, чтобы показать, что я имею в виду, бок о бок сравнения двух методов.Ниже я также помещаю небольшие примеры кода, используемые в диаграммах:

enter image description here

код для метода части выражения

Manipulate[
foo[]:=Module[{},
x++
];
ctrl;
foo[],

Button["step",{ctrl++ }],
{{ctrl,0},None},
{{x,0},None},
TrackedSymbols:>{ctrl}

]

код для метода инициализации модуля

Manipulate[
 ctrl;
 foo[],

 Button["step", {ctrl++ }],
 {{ctrl, 0}, None},
 {{x, 0}, None},
 TrackedSymbols :> {ctrl},

 Initialization :>
  {
   foo[] := Module[{},
     x++
     ]
   }
 ]

Вопрос: будет ли снижение производительности в методе выражения "модули внутри - манипулирование"?

добавлено примечание:

Между прочим, в моей текущей небольшой демонстрации я НЕ заметил никакой разницы в производительности в обоих методах, но это просто основано на наблюдении за реакцией демонстрации, а не на точных измерениях. Возможно, я неправильно понял раздел инициализации Manipulate. Из справки он говорит:

Initialization is an option for Dynamic, DynamicModule, Manipulate, 
and related constructs that specifies an expression to be evaluated when 
the construct is first used or displayed.

И похоже, может быть, я истолковал это как значение, отличное от того, что есть на самом деле.

Может быть, Manipulate всегда оценивал все модули каждый раз в рамках обновления / обновления своего выражения?

В любом случае, я был бы счастлив, если бы не оказалось разницы в производительности двух макетов, как сейчас на, я помещу все модули внутри самого выражения Manipulate, а не в раздел инициализации.

сложение 19 декабря 2001 г., 23:00 Я посмотрел на решение Mr Wizard, размещенное ниже. Из того, что я вижу, глядя на снимок Manipulate, полученный код эквивалентен явному помещению модуля в выражение Manipulate. Вот снимок экрана, показывающий оба метода и результирующий код (сгенерированный функцией управления с помощью кнопки выбора снимка) для каждого макета. Мы видим, что это тот же код.

Но трюк, который использовал мистер Волшебник, чтобы разрешить функцию помещать в Control-> None, а именно написать просто foo вместо foo [] , я бы хотел не задумывались. Я всегда думал, что нужно писать foo []: = Module [...] , даже если foo не принимает аргументов. (на самом деле я даже не думал об этом, я просто пишу [] в конце каждого имени функции, даже если не принимает аргументов). Спасибо, что поделились этим трюком.

enter image description here

7
задан Cœur 19 August 2017 в 05:07
поделиться