楼主: 6203479170
1568 3

[原创博文] 求救贴:如何提高下面代码的效率? [推广有奖]

  • 0关注
  • 0粉丝

硕士生

97%

还不是VIP/贵宾

-

威望
0
论坛币
90 个
通用积分
0.0600
学术水平
2 点
热心指数
7 点
信用等级
2 点
经验
292 点
帖子
125
精华
0
在线时间
218 小时
注册时间
2009-8-2
最后登录
2022-1-14

30论坛币
data final;
input _name_ $;
cards;
test
;
run;
%macro samp(n,m,t);
data temp(drop=i);
do i= 1 to &n;
a=i;
output;
end;
run;
%macro repeat;
proc surveyselect data=temp noprint out=rand method=srs sampsize=&m seed=0;
run;
proc transpose data=rand out=tran;
run;
data trantemp(drop=i);
set tran;
run;
data final(drop=_name_);
set final trantemp;
run;
%mend repeat;
%do i=1 %to &t;
%repeat;
%end;
%mend samp;
%samp(33,7,1000000);
这段代码的大概意思是,参数宏SAMP(n,m,t)从N个号码中无放回抽取M个号码,然后抽取t次,并把t次的结果放在FINAL的DATASET里;我打算运行100万次,但我连运行10000次都很吃力,请问各位大虾如何提高效率呢?

最佳答案

soporaeternus 查看完整内容

不知道是不是准确的无放回 效率4秒多一点 希望对你有帮助
关键词:如何提高 surveyselect Transpose Surveys dataset method repeat 如何

本帖被以下文库推荐

沙发
soporaeternus 发表于 2010-8-1 20:45:32 |只看作者 |坛友微信交流群
  1. %MACRO samp(n,m,t);
  2.         data final;
  3.         retain t;
  4.         array x x1-x&m;
  5.         do t=1 to &t by 1;
  6.                 m=&m;
  7.                 do n=1 to &n by 1;
  8.                         r=ranuni(123);
  9.                         if r<=m/(&n-n+1) then do;
  10.                                 x[&m-m+1]=n;
  11.                                 m=m-1;
  12.                         end;
  13.                 end;
  14.         output;
  15.         end;
  16.         drop m n r;
  17.         run;
  18. %MEND samp;
  19. %samp(30,17,1000000);
复制代码
不知道是不是准确的无放回
效率4秒多一点
希望对你有帮助
Let them be hard, but never unjust

使用道具

藤椅
6203479170 发表于 2010-8-1 21:56:36 |只看作者 |坛友微信交流群
我的目的只需要从N个号码中无放回抽取M个号码,然后抽取t次,并把t次的结果放在FINAL的DATASET里
,目标的T为100W即可。各位大可不按我的代码的思路。

使用道具

板凳
bobguy 发表于 2010-8-2 07:51:15 |只看作者 |坛友微信交流群
6203479170 发表于 2010-8-1 20:45
data final;
input _name_ $;
cards;
test
;
run;
%macro samp(n,m,t);
data temp(drop=i);
do i= 1 to &n;
a=i;
output;
end;
run;
%macro repeat;
proc surveyselect data=temp noprint out=rand method=srs sampsize=&m seed=0;
run;
proc transpose data=rand out=tran;
run;
data trantemp(drop=i);
set tran;
run;
data final(drop=_name_);
set final trantemp;
run;
%mend repeat;
%do i=1 %to &t;
%repeat;
%end;
%mend samp;
%samp(33,7,1000000);
这段代码的大概意思是,参数宏SAMP(n,m,t)从N个号码中无放回抽取M个号码,然后抽取t次,并把t次的结果放在FINAL的DATASET里;我打算运行100万次,但我连运行10000次都很吃力,请问各位大虾如何提高效率呢?
First there is no need/point to use macro.
Second why you need a million samplings. It sounds way too much.

Changing reps=4 to 1000000 will do it. Good luck!



   data temp;
      do i = 1 to 33;
         output;
      end;
    run;

     proc surveyselect  data=temp out=rand method=srs sampsize=7 seed=1
         reps=4;
   
   run;

   proc print; run;
已有 2 人评分学术水平 热心指数 收起 理由
crackman + 1 + 1
BraveMadMan + 1 + 1 对论坛有贡献

总评分: 学术水平 + 2  热心指数 + 2   查看全部评分

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 21:31