在 if-else 语句中排序是否更有利(有效)?
Is sorting more favorable (efficient) in if-else statement?
假设定义了两个函数 fun1, fun2
来执行给定输入 x
的一些计算。
数据have
的结构是:
Day Group x
01Jul14 A 1.5
02JUl14 B 2.7
我想这样做:
data want;
set have;
if Group = 'A' then y = fun1(x);
if Group = 'B' then y = fun2(x);
run;
先 proc sort data=have;by Group;run;
然后继续数据步骤更好吗?或者它并不重要,因为每次它只选择一个观察并确定它属于哪个 if
语句?
只要您不做任何改变观察的正常输入的事情——例如使用随机访问 (point=
)、构建哈希 [=25=]、使用 by
语句等 - 排序不会产生影响:无论 if 语句如何,您都读取每一行,检查两行,执行其中之一。排序或未排序没有什么不同。
这很容易测试。像这样写:
%put Before Unsorted Time: %sysfunc(time(),time8.);
***your datastep here***;
%put After Unsorted Time: %sysfunc(time(),time8.);
proc sort data=your_dataset;
by x;
run;
%put Before Sorted Time: %sysfunc(time(),time8.);
***your datastep here***;
%put After Sorted Time: %sysfunc(time(),time8.);
或者只 运行 你的数据步并查看执行时间!
您可能会将此与排序 if
语句(即更改它们在代码中的顺序)混淆。如果您的数据倾斜并且您使用 else
,那可能会产生影响。这是因为 SAS 不必评估进一步的下游条件。这不会产生任何影响——只有当你有极度偏斜的数据、大量的观察和基于你的代码的某些其他条件时它才重要——所以我不会为它编程。
假设定义了两个函数 fun1, fun2
来执行给定输入 x
的一些计算。
数据have
的结构是:
Day Group x
01Jul14 A 1.5
02JUl14 B 2.7
我想这样做:
data want;
set have;
if Group = 'A' then y = fun1(x);
if Group = 'B' then y = fun2(x);
run;
先 proc sort data=have;by Group;run;
然后继续数据步骤更好吗?或者它并不重要,因为每次它只选择一个观察并确定它属于哪个 if
语句?
只要您不做任何改变观察的正常输入的事情——例如使用随机访问 (point=
)、构建哈希 [=25=]、使用 by
语句等 - 排序不会产生影响:无论 if 语句如何,您都读取每一行,检查两行,执行其中之一。排序或未排序没有什么不同。
这很容易测试。像这样写:
%put Before Unsorted Time: %sysfunc(time(),time8.);
***your datastep here***;
%put After Unsorted Time: %sysfunc(time(),time8.);
proc sort data=your_dataset;
by x;
run;
%put Before Sorted Time: %sysfunc(time(),time8.);
***your datastep here***;
%put After Sorted Time: %sysfunc(time(),time8.);
或者只 运行 你的数据步并查看执行时间!
您可能会将此与排序 if
语句(即更改它们在代码中的顺序)混淆。如果您的数据倾斜并且您使用 else
,那可能会产生影响。这是因为 SAS 不必评估进一步的下游条件。这不会产生任何影响——只有当你有极度偏斜的数据、大量的观察和基于你的代码的某些其他条件时它才重要——所以我不会为它编程。