在 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 不必评估进一步的下游条件。这不会产生任何影响——只有当你有极度偏斜的数据、大量的观察和基于你的代码的某些其他条件时它才重要——所以我不会为它编程。