我想问是否有人知道任何问题(性能或其他),如果有人要定义/放置 Manipulate 表达式使用的模块,就在 Manipulate 表达式本身内部,而不是在初始化部分,通常在哪里完成。
两种方法都有效,但是从模块直接访问 Manipulate 动力学时语义不同(与它们作为参数传递给模块相比,这实际上是更好的方法,但我现在正在尝试)
我不知道这些东西是怎么实现的,但我担心如果我把所有的模块都放在 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++
]
}
]
问题是:modules-inside-manipulate 表达式方法会不会影响性能?
补充说明:
顺便说一句,在我目前的小型演示中,我没有注意到两种方法的任何性能差异,但这只是基于观察演示的响应而没有精确的测量。可能是我对 Manipulate 的 Initialization 部分的理解一直都不正确。从帮助它说:
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 表达式本身,而不是放在 Initialization 部分。
补充 2001 年 12 月 19 日晚上 11 点
我查看了下面发布的 Mr Wizard 解决方案。从我所见,查看 Manipulate 快照,生成的代码相当于显式地将模块放入 Manipulate 表达式中。这是显示两种方法的屏幕截图,以及每个布局的结果代码(由操作函数生成,使用快照选项按钮)。我们可以看到它是相同的代码。
但是,Mr Wizard 用来允许将函数放在 Control->None 中的技巧就是只写
foo
。而不是 foo[]
是我不会想到的。我一直认为必须写foo[]:=Module[...]
即使foo
不接受任何论据。 (其实我从来没想过,我只是很自然地在每个函数名的末尾写 [] ,即使不带参数)。感谢分享这个技巧。最佳答案
我认为这必须是特定于应用程序的。您可以插入 Pause[1];
foo[]:=
之前的表达式在这两个示例中确认重新评估不会发生在 Initialization
方法,而它在另一个。评估您的表达式需要多少时间的问题是您最适合回答的问题。你为什么不把你所有的定义放在一个大的Do
循环和时间呢?
另外,虽然我通常不会推荐它,但由于您在限制条件下工作,也许您正在打开这种性质的黑客:
Manipulate[
ctrl; foo[],
Button["step", {ctrl++}],
{{ctrl, 0}, None},
{{x, 0}, None},
{{foo, Module[{}, x++] &}, None},
TrackedSymbols :> {ctrl}
]
关于wolfram-mathematica - 将模块定义为 Manipulate 表达式的一部分与初始化部分中的任何性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8550358/