全部,
想知道是否有人对时间矩阵与数据表进行了类似的跟踪。
Clear Log(); Clear Globals(); Close All(DataTables,"No Save");
// Inputs
a = 7;
// Approach 1
TimerStart_1 = Tick Seconds();
dt1 = New Table("Approach-1","Invisible");
dt1 << New Column("Random-1",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Random-2",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Add",Numeric,Continuous,Formula(:Name("Random-1")+:Name("Random-2")))
<< New Column("Subtract",Numeric,Continuous,Formula(:Name("Random-1")-:Name("Random-2")))
<< New Column("Multiply",Numeric,Continuous,Formula(:Name("Random-1")*:Name("Random-2")))
<< New Column("Mod",Numeric,Continuous,Formula(Mod(:Name("Random-1"),:Name("Random-2"))));
TimerEnd_1 = Tick Seconds();
Show(TimerEnd_1 - TimerStart_1);
Close All(DataTables,"No Save");
// Approach 2
TimerStart_2 = Tick Seconds();
Mat_1 = Random Index(10^8,10^a);
Mat_2 = Random Index(10^8,10^a);
Add = Mat_1 + Mat_2 ;
Difference = Mat_1 - Mat_2 ;
Prod =E Mult (Mat_1,Mat_2);
Mod = Mod(Mat_1,Mat_2);
TimerEnd_2 = Tick Seconds();
Show(TimerEnd_2 - TimerStart_2);


将数据表设为私有,可能会节省更多时间,但总的来说,这是公平的,还是有人仅仅为了速度而偏爱一个数据容器而不是另一个?
@gzmorgan0 ,
感谢您的详细回复。 您的解释大多是准确的,我希望我一开始就提供更清晰的说明。 我同意并分享您在数据表和矩阵之间的偏好,如果我需要更多内置方法而不是矩阵,我会使用数据表。 然而,我想选择社区大脑的问题是处理大数据的速度,以及随着数据大小的增加,行为是否以及为什么会发生变化。 我想相信这是因为您所指的存储压缩。
一个有趣的方面是通过数据表子脚本节省的时间量。 在 a = 7 时,它比传统的列公式方法节省了 7 秒的时间——矩阵在性能方面仍然领先。
你有两个问题:这公平吗?你更喜欢一个吗?
关于公平,内存管理完全取决于语言提供者。请记住,表比矩阵有更多的方法。我会将您的第一个问题表述为:“预期性能会在 100 万到 1000 万之间发生变化吗?” 此外,我只是猜测在 100 万行之后,JMP 可能会进行一些存储压缩,换句话说,节省内存,权衡是时间。
我喜欢什么取决于任务。 如果我正在做一个模拟,其中一个方法被多次应用并且我得到了总结性能,那么我将使用一个矩阵。在具有更好的子表引用的 JMP 13 之前,如果我有大表,我会使用矩阵然后将值设置到表中专门用于性能,我会绝不对大表使用公式。
我附上了一个脚本,该脚本将使用 JMP 13 子表引用语法的第三种方法附加到您的脚本中。 下面的代码片段是 Add 列的语法。 [这个网站不允许我发布附件,所以去最后看看填充脚本。]
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
注意,既然你对性能感兴趣,试试这个,
a=5;
tb1 = TickSeconds();
Mat_1 = Random Index(10^8,10^a);
te1 = TickSeconds();
tb2 = TickSeconds();
Mat_2 = Round (J(10^a, 1, Random Uniform(10^8) )*10^8,0);
te2 = TickSeconds();
show(te1-tb1, te2-tb2);
对于 a<7,第二种方法远优于方法 1。
a = 6:te1 - tb1 = 2.43333333334886; te2 - tb2 = 0.25; //第二种方法优越
a = 7:te1 - tb1 = 2.48333333339542; te2 - tb2 = 2.56666666665114; //两个方法一样
a = 8:te1 - tb1 = 3.03333333344199; te2 - tb2 = 25.8166666666511; //第二种方法更糟糕
和你一样,当有很大的不同时,我会向 JMP 发送一张便条作为仅供参考。
对于运行脚本的人,请注意它正在关闭所有表等。在 JMP 的新会话中运行。
Clear Log(); Clear Globals(); Close All(DataTables,"No Save");
// Inputs
a = 7;
// Approach 1
TimerStart_1 = Tick Seconds();
dt1 = New Table("Approach-1","Invisible");
dt1 << New Column("Random-1",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Random-2",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Add",Numeric,Continuous,Formula(:Name("Random-1")+:Name("Random-2")))
<< New Column("Subtract",Numeric,Continuous,Formula(:Name("Random-1")-:Name("Random-2")))
<< New Column("Multiply",Numeric,Continuous,Formula(:Name("Random-1")*:Name("Random-2")))
<< New Column("Mod",Numeric,Continuous,Formula(Mod(:Name("Random-1"),:Name("Random-2"))));
TimerEnd_1 = Tick Seconds();
Show(TimerEnd_1 - TimerStart_1);
Close All(DataTables,"No Save");
// Approach 2
TimerStart_2 = Tick Seconds();
Mat_1 = Random Index(10^8,10^a);
Mat_2 = Random Index(10^8,10^a);
Add = Mat_1 + Mat_2 ;
Difference = Mat_1 - Mat_2 ;
Prod =E Mult (Mat_1,Mat_2);
Mod = Mod(Mat_1,Mat_2);
TimerEnd_2 = Tick Seconds();
Show(TimerEnd_2 - TimerStart_2);
// Approach 3
TimerStart_3 = Tick Seconds();
dt1 = New Table("Approach-3","Invisible", add rows(10^a),
New Column("Random-1",Numeric,Continuous ),
New Column("Random-2",Numeric,Continuous ),
New Column("Add",Numeric,Continuous ),
New Column("Subtract",Numeric,Continuous ),
New Column("Multiply",Numeric,Continuous ),
New Column("Mod",Numeric,Continuous)
);
// Column(dt1, "Random-1") << Set Values( Random Index(10^8,10^a) );
// Column(dt1, "Random-2") << Set Values( Random Index(10^8,10^a) );
// Column(dt1, "Add") << Set Values( dt1[0,"Random-1"]+ dt1[0,"Random-2"] );
// Column(dt1, "Subtract") << Set Values( dt1[0,"Random-1"]- dt1[0,"Random-2"] );
// Column(dt1, "Multiply") << Set Values( dt1[0,"Random-1"]:* dt1[0,"Random-2"] );
// Column(dt1, "Mod") << Set Values( Mod(dt1[0,"Random-1"], dt1[0,"Random-2"]) );
dt1[0,"Random-1"] = Random Index(10^8,10^a) ;
dt1[0,"Random-2"] = Random Index(10^8,10^a) ;
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
dt1[0, "Subtract"] = dt1[0,"Random-1"]- dt1[0,"Random-2"] ;
dt1[0, "Multiply"] = dt1[0,"Random-1"]:* dt1[0,"Random-2"] ;
dt1[0, "Mod"] = Mod(dt1[0,"Random-1"], dt1[0,"Random-2"] );
TimerEnd_3 = Tick Seconds();
Show(TimerEnd_3 - TimerStart_3);
Close All(DataTables,"No Save");