全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2871 18
2010-05-07
有一数据表,表名:table   字段:x1,x2,……,x200    记录数:1亿
data a(keep=x1);
     set table(keep=x1 where=(x1>100));
run;
data b;
     set table;
     where x1>100;
     keep x1;
run;
两种写法的效率一样吗?

个人意见,望指正和讨论;
个人认为两种写法效率应该一样。
表a:
      编译时,sas识别出程序涉及到的变量只有x1,  因此只读入x1字段值 并在读入时用where条件筛选;
表b:
     碰到run语句后,进行编译,程序中涉及到的变量只有 x1 因此读table时也只会读这个字段而忽略别的字段;在写入时判断where条件。
     由于不管读入时判断还是写时判断,都要对x1先读取,再考虑到是逐条记录读取和输出,因此where影响不存在。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-5-7 21:13:16
个人认为第一个效率要高于第二个效率
因为第一个程序 一开始就对table数据集进行了一次洗刷,然后在进行SET读取 a里面
第二个程序 则是一开始全部读取table里面的数据,然后在进行洗刷

等于咱们做事的风格一样
第一个程序就像 咱们选选择对象了 在开始干活吧,这样做事有针对性,效率高
第二程序就像 咱们先不去想要谁还是不要谁的问题,先干活,全部要了,然后慢慢来剔除不需要的,做事盲目,没有效率
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-7 21:13:57
个人认为第一个效率要高于第二个效率
因为第一个程序 一开始就对table数据集进行了一次洗刷,然后在进行SET读取 a里面
第二个程序 则是一开始全部读取table里面的数据,然后在进行洗刷

等于咱们做事的风格一样
第一个程序就像 咱们选选择对象了 在开始干活吧,这样做事有针对性,效率高
第二程序就像 咱们先不去想要谁还是不要谁的问题,先干活,全部要了,然后慢慢来剔除不需要的,做事盲目,没有效率
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-7 21:19:58
但是我按两种方法在eg上测试了下,两者的cpu时间几本上没有差别
测试的数据有几十字段,只处理一个字段,记录数在千万左右;
cpu时间分别是
a方法8:08.70
b方法8:02.76  
貌似后者还快点,两次都是后者稍快点,所以才产生疑问;

个人认为碰到run语句代码编译完毕,在读入时,sas会自动忽略不读在整个程序中没有出现的变量。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-7 21:24:16
我也是百万级的数据
测试了两遍
不稳定 感觉所需要的时间
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-7 21:31:00
你测试的两种方法的cpu时间差别大吗?

我以前也是和你一样认为,但测试后发现不明显,自己猜想sas也不会那么笨去读一些用不到的东西浪费时间
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群