作者missingmini (just missing)
看板R_Language
标题Re: [问题] 应用回圈於资料处理的效率
时间Sat Aug 8 00:25:43 2015
感谢C大和W大指教,学了不少新东西,许多观念也有茅塞顿开的感觉,真的非常感谢!
有些东西还是有小疑问:
==============================================================================
1. C大用来取代我第4段程式的写法如下
## 4
tbl_right_ID = table(tbl_right$ID)
tbl_right_ID[match(comm_ID$ID, names(tbl_right_ID))] %>% sum
想问的是为什麽要先把tbl_right$ID建成一个table,然後在match里面再取其names来用?
有没有方法可以直接用tbl_right物件来操作?
==============================================================================
2. W大提到的回圈测时程式
system.time({
I = 0
while (I < 1e7) {
10
I = I + 1
}
})
为什麽要有"10"这一行? 有什麽特殊作用? 我试过把该行comment out再执行,结果
比原来快了 0.3 秒左右。
==============================================================================
至於W大提到的讨论loop的文章,我有空会仔细读的,届时再来跟大家分享心得。
最後,为了想知道R的回圈跟C++的回圈速度上的差异,做了个不是很严谨的小实验
// C++ code
#include <stdio.h>
#include <sys/time.h>
int main(void)
{
bool val_bool;
struct timeval tp, tp2;
val_bool = false;
gettimeofday(&tp, NULL);
for (int i = 0; i < 100000001; i++) {
val_bool = !val_bool;
}
gettimeofday(&tp2, NULL);
printf("%ld microseconds elapsed\n", tp2.tv_sec * 1000000 + tp2.tv_usec -
(tp.tv_sec * 1000000 + tp.tv_usec));
printf("%s\n", val_bool ? "TRUE" : "FALSE");
return 0;
}
# R code
val_bool <- FALSE
ptm <- system.time({
for (i in 1:100000001) {
val_bool <- !val_bool
}
})
print(ptm)
print(val_bool)
在我的电脑执行结果:
C++:
215609 microseconds elapsed
TRUE
R:
user system elapsed
25.323 0.209 25.331
[1] TRUE
C++花了0.216秒,R则要25.33秒,差距超过100倍。
(注:C++ compile时要把optimization关掉,例如g++要加-O0 switch,否则compiler
是很聪明的,会直接把回圈整个取消掉,直接给你!val_bool,费时 0 microsecond!)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.127.14.10
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1438964746.A.59F.html
※ 编辑: missingmini (59.127.14.10), 08/08/2015 00:32:20
※ 编辑: missingmini (59.127.14.10), 08/08/2015 00:35:07