Я хотел бы спросить, знает ли кто-нибудь о каких-либо проблемах (производительности или других), если нужно определить / поставить модуль (ы), используемый выражением Manipulate, прямо внутри самого выражения Manipulate, а не в разделе инициализации, где это обычно делается.
Оба метода работают, но семантика не одинакова, когда дело доходит до прямого доступа к Manipulate Dynamics из модуля (по сравнению с их передачей в качестве аргументов модулю, что на самом деле является лучшим методом, но я пробую кое-что now)
Я не знаю, как эти вещи реализованы, но меня беспокоит, что если я помещу все модули в выражение Manipulate, то Manipulate будет замедляться, когда там много модулей, поскольку каждый раз его нужно обновлять выражение, Mathematica FE отправит ядру теперь гораздо более крупное выражение для переоценки / синтаксического анализа или любого другого правильного термина.
Обновляемое выражение Manipulate теперь намного больше, поскольку модули теперь являются частью самого выражения Manipulate, а не находятся в секции инициализации, и это происходит, даже если некоторые из них могут не вызываться при каждом обновлении.
Чтобы лучше объяснить вопрос, я сделал небольшую диаграмму ниже, чтобы показать, что я имею в виду, бок о бок сравнения двух методов.Ниже я также помещаю небольшие примеры кода, используемые в диаграммах:
код для метода части выражения
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
не принимает аргументов. (на самом деле я даже не думал об этом, я просто пишу [] в конце каждого имени функции, даже если не принимает аргументов). Спасибо, что поделились этим трюком.