Nas*_*ser 7 wolfram-mathematica
我想请问如果任何问题(性能或其他方式)如果一个人定义/把通过操纵表达式中使用的模块(一个或多个)任何人知道,对里面的操纵初始化部分表达式本身,对,通常它在哪里完成.
这两种方法的工作,但是当涉及到直接访问从模块操纵动态语义是不一样的(相对于它们作为参数传递到模块,这实际上是更好的方法传递,但现在我想的东西)
我不知道这些东西是如何实现的,但我很担心,如果我把操纵表达式中的所有模块,然后操纵时,有许多模块存在,会减慢每次需要刷新的表达,Mathematica的时间,因为FE将向内核发送一个更大的表达式来重新评估/解析或者正确的术语.
现在刷新的Manipulate表达式现在要大得多,因为模块现在是Manipulate表达式本身的一部分,而不是在初始化部分,即使其中一些可能在每次刷新时都没有调用,也会发生这种情况.
为了更好地解释这个问题,我在下面做了一个小图来说明我的意思,并排比较两种方法.在下面,我还把图中使用的小代码示例:

表达式方法的代码
Manipulate[
foo[]:=Module[{},
x++
];
ctrl;
foo[],
Button["step",{ctrl++ }],
{{ctrl,0},None},
{{x,0},None},
TrackedSymbols:>{ctrl}
]
Run Code Online (Sandbox Code Playgroud)
模块初始化方法的代码
Manipulate[
ctrl;
foo[],
Button["step", {ctrl++ }],
{{ctrl, 0}, None},
{{x, 0}, None},
TrackedSymbols :> {ctrl},
Initialization :>
{
foo[] := Module[{},
x++
]
}
]
Run Code Online (Sandbox Code Playgroud)
问题是:模块内部操作表达方法是否会有性能损失?
注意补充:
顺便说一句,在我目前的小型演示中,我没有注意到这两种方法的任何性能差异,但这只是基于观察演示的响应而没有精确的测量.可能是我对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.
Run Code Online (Sandbox Code Playgroud)
看起来我可能会将其解释为具有不同的含义.
可能是Manipulate每次都在评估所有模块,作为其表达式刷新/更新的一部分?
无论哪种方式,如果事实证明两个布局没有性能差异,我会很高兴,从现在开始,我将把所有模块放在Manipulate表达式本身,而不是在Initialization部分.
2001年12月19日晚上11点 我看了下面发布的先生精灵解决方案.从我看到的,查看Manipulate快照,生成的代码相当于将模块显式放在Manipulate表达式中.下面是一个屏幕截图,显示了每种方法以及由此产生的代码(由Manipulate Function生成,使用快照选项按钮).我们可以看到它是相同的代码.
但是,巫师先生用来允许一个函数的技巧被放在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}
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |