Re: [問題] 應用迴圈於資料處理的效率
看板R_Language作者missingmini (just missing)時間10年前 (2015/08/08 00:25)推噓0(0推 0噓 0→)留言0則, 0人參與討論串4/5 (看更多)
感謝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://www.ptt.cc/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
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 4 之 5 篇):