wolfram-mathematica - 将模块定义为 Manipulate 表达式的一部分与初始化部分中的任何性能问题?

标签 wolfram-mathematica

我想问是否有人知道任何问题(性能或其他),如果有人要定义/放置 Manipulate 表达式使用的模块,就在 Manipulate 表达式本身内部,而不是在初始化部分,通常在哪里完成。

两种方法都有效,但是从模块直接访问 Manipulate 动力学时语义不同(与它们作为参数传递给模块相比,这实际上是更好的方法,但我现在正在尝试)

我不知道这些东西是怎么实现的,但我担心如果我把所有的模块都放在 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++
     ]
   }
 ]

问题是: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不接受任何论据。 (其实我从来没想过,我只是很自然地在每个函数名的末尾写 [] ,即使不带参数)。感谢分享这个技巧。

enter image description here

最佳答案

我认为这必须是特定于应用程序的。您可以插入 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/

相关文章:

wolfram-mathematica - 数学中结构的第一人称视角

image - 在 Mathematica 的 3D 绘图中将图像放置在 XY 平面上

image - 数学: Add text to imported image/graphic as a label

if-statement - 一般来说,用一对嵌套的 IF 替换 AND 会加快速度吗?

java - 如何自动生成变音元音表?

performance - 从给定的数字和运算集创建表达式树,并在 Mathematica 8 或更高版本中找到计算结果为目标数字的表达式树

math - 获取方程的分支点

list - 模拟 Length 函数以获取列表的长度

wolfram-mathematica - 两个列表的元素最大值

python - 有时在 python 和 mathematica 中计算的特征向量有相反的符号有人知道为什么吗?