打算用IML矩阵运算的方式替代掉base编程的方法,将做一系列的实验,比较两种方法的效率。
1、矩阵可以节约更多的代码
2、矩阵代表了一种更高维度的思考方法
运算数据ex:a={0 0 -2.5 4 0 3 0.5 8 -1...};
****************************base方法*************************************
data ss;
set test;
do i=1 to 10000000;
if col1 > 0 then p+1;
else if col1 < 0 then n+1;
end;
run;
循环1000万次
***********************IML方法******************************
proc iml;
a={0 -1 1 5 2 4 0 -1 2 6 9 -1 };
do i=1 to 10000000;
b=a>0;
c=a<0;
b_res=b[,+];
c_res=c[,+];
end;
quit;
****************************************************************************************
比较:代码的字数上差不多,但执行效率base的要高2个数量级。
a为3元素 IML: 4.69s Base:0.04s
a为6元素 IML:4.75s Base:0.06s
a为9元素 IML:4.66s Base:0.06s
a为12元素IML:4.69s Base:0.06s
a为18元素IML:4.85s Base:0.06s
a为45元素IML:5.91s Base 0.04s
(IML:600ns/次 Base:4ns/次)
结果:Base比IML快2个数量级
原因分析:
1、IML可能有许多预载项
2、IML的操作全部是“实”的,无论是比较(a>0)或者是累加b[,+],都是对所有元素进行了比较以及写入(最费时)。
3、Base使用逻辑判断,理论上比较的次数比IML要少一半(roughly),赋值的次数少一半。
结论:
1、IML的操作都是“实”操作,在进行大规模计算的时候要特别注意(100倍的时间代价)
2、是否有更好的IML语句?(或者更好的矩阵运算工具)
3、在关键代码上,IML比Base少一半,是存在很大的简洁性的。在构建更复杂的程序(算法)时,
更精简的关键逻辑意味着更少的错误和更高复杂功能的实现。
下一步:
继续比较其他方面的性能差异。
*************关键代码比较********************************************************
IML:
b=a>0;
c=a<0;
b =b[,+];
c =c[,+];
Base:
if col1 > 0 then p+1;
else if col1 < 0 then n+1;