Re: [问题] 应用循环于资料处理的效率

楼主: missingmini (just missing)   2015-08-08 00:25:43
感谢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!)

Links booklink

Contact Us: admin [ a t ] ucptt.com