gpt4 book ai didi

wolfram-mathematica - 分析 Mathematica 代码

转载 作者:行者123 更新时间:2023-12-04 01:04:30 24 4
gpt4 key购买 nike

有没有一种在 Mathematica 中分析代码的好方法?我希望能够递归(即,如果我说 f[a_] := b[a] ,那么 Profile[f[1]] 应该给出与 Profile[b[1]] 几乎相同的输出),但我会满足于能够做类似应用 Timing 的事情到每个相关的子表达式。如果我不需要像 Module 这样的特殊情况就好了,但我想要,例如,Profile[Module[{x=1+2},x!]]给我一个输出

Time    Expression         Result
0 1 1
0 2 2
0 1 + 2 3
0 x$1234 3
0 x$1234 ! 6
0 Module[{x=1+2},x!] 6

6

最佳答案

是的,Wolfram Workbench 确实有一个分析器,尽管 according to the documentation输出不是您想要的形式。

我应该注意到 Mr.Wizard 在评论中提出的问题 - 缓存结果将导致不同的计时结果 - 也适用于配置文件。

如果您想在 Mathematica 中专门做一些事情,您可以尝试以下操作:

myProfile[fun_Symbol,inputs_List]:=  
TableForm[#[[{1,3,2}]]&/@ (Join @@@ ({Timing[f[#]],#} & /@ inputs))]

如果您很高兴将输出设为 {timing,output, input},而不是问题中指定的 {timing, input, output},则可以去掉 #[[{1,3,2}]]位。

编辑

因为我有 Workbench,所以这里有一个例子。我有一个包裹 AdvancedPlots其中包括一个函数 CobwebPlot (是的,功能本身可以改进)。
CobwebPlot[x_?MatrixQ, opts___Rule] /; 
And @@ (NumericQ /@ Flatten[x]) :=
Module[{n, \[Theta]s, numgrids, grids, struts, gridstyle, min, max,
data, labels, epilabels, pad},
n = Length[First[x]];
\[Theta]s = (2 \[Pi])/n Range[0, n] + If[OddQ[n], \[Pi]/2, 0];
numgrids =
If[IntegerQ[#] && Positive[#], #,
NumberofGrids /.
Options[CobwebPlot] ] & @ (NumberofGrids /. {opts});
{min, max} = {Min[#], Max[#]} &@ Flatten[x];
gridstyle = GridStyle /. {opts} /. Options[CobwebPlot];
pad = CobwebPadding /. {opts} /. Options[CobwebPlot];
grids =
Outer[List, \[Theta]s, FindDivisions[{0, max + 1}, numgrids]];
struts = Transpose[grids];
labels = CobwebLabels /. {opts} /. Options[CobwebPlot];
epilabels =
If[Length[labels] == n,
Thread[Text[
labels, (1.2 max) Transpose[{Cos[Most[\[Theta]s]],
Sin[Most[\[Theta]s]]}]]], None];
data = Map[Reverse,
Inner[List, Join[#, {First[#]}] & /@ x, \[Theta]s, List], {2}];
Show[ListPolarPlot[grids, gridstyle, Joined -> True, Axes -> False,
PlotRangePadding -> pad],
ListPolarPlot[struts, gridstyle, Joined -> True, Axes -> False],
ListPolarPlot[data,
Sequence @@ FilterRules[{opts}, Options[ListPolarPlot]],
Sequence @@
FilterRules[Options[CobwebPlot], Options[ListPolarPlot]],
Joined -> True, Axes -> None] ,
If[Length[labels] == n, Graphics /@ epilabels,
Sequence @@ FilterRules[{opts}, Options[Graphics]] ]]
]

在 Debug模式下运行包

然后运行这个笔记本

enter image description here

给出以下输出。

enter image description here

关于wolfram-mathematica - 分析 Mathematica 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com