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