[問題] 使用function的執行速度

看板R_Language作者 (翟南)時間10年前 (2015/09/10 23:32), 10年前編輯推噓2(2036)
留言38則, 4人參與, 最新討論串1/1
[問題類型]: 效能諮詢(我想讓R 跑更快) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 問題是關於運算速度的差異 1.在A function中又使用了B function作運算 Ex. r = abs(diff(P[(t-(N+1)):(t-1)])) sum(r)/N 2.先執行B function,將結果以b儲存,在將b用A function作運算 Ex. sum(abs(diff(P[(t-(N+1)):(t-1)])))/N 以上兩種寫法想請教一下,在執行的速度上會有很大的差異嗎? 小弟完整的程式中會是包更多個function 煩請大大們給予點建議,謝謝 ^^ [程式範例]: -- 離開你的視線~讓情緒完完整整的宣洩~ 我想今夜就這樣吧~ 反正孤獨也無所謂~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.141.5 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1441899128.A.3B9.html ※ 編輯: PhysicsBoy (61.228.141.5), 09/10/2015 23:32:35

09/11 00:06, , 1F
少複製一次記憶體,應該有差
09/11 00:06, 1F

09/11 00:06, , 2F
但是差異應該很小
09/11 00:06, 2F

09/11 00:07, , 3F
你可以rbenchmark 1000次看看
09/11 00:07, 3F

09/11 13:57, , 4F
考慮程式碼開發與維護的成本常常比執行速度還重要很多。
09/11 13:57, 4F

09/11 13:59, , 5F
如果與都寫在一起,要除蟲或改寫會比較難。請考慮這點。
09/11 13:59, 5F

09/11 14:00, , 6F
所以這時候要推薦magrittr
09/11 14:00, 6F

09/11 14:01, , 7F
P %>% '['((t-(N+1)):(t-1)) %>% diff %>% abs %>%
09/11 14:01, 7F

09/11 14:01, , 8F
sum %>% divide_by(N)
09/11 14:01, 8F

09/11 14:01, , 9F
magrittr可以在板上搜尋到介紹文章
09/11 14:01, 9F

09/11 14:59, , 10F
長知識了,有空來研究一下,至於維護就靠詳細筆記^^
09/11 14:59, 10F

09/11 21:41, , 11F
注意程式碼過度相依的問題。只是原則沒有絕對。
09/11 21:41, 11F

09/11 23:13, , 12F
什麼是程式碼過度相依?
09/11 23:13, 12F

09/12 00:33, , 13F
例如函數A裡使用函數B,如果函數B要改,就改函數B就好。
09/12 00:33, 13F

09/12 00:36, , 14F
若都寫在一起成函數C,想改變原本函數B的部份都要改寫。
09/12 00:36, 14F

09/12 00:38, , 15F
簡單來說,避免「牽一髮而動全身」就是了。
09/12 00:38, 15F

09/12 00:39, , 16F
至於相依,在這個例子不太明顯。在開發package可能會明
09/12 00:39, 16F

09/12 00:40, , 17F
白一點。
09/12 00:40, 17F

09/12 00:40, , 18F
把a大的話翻譯一下,應該是重複使用的程式應該獨立
09/12 00:40, 18F

09/12 00:40, , 19F
避免更改時只有更動到部分的block
09/12 00:40, 19F

09/12 00:41, , 20F
相依就像A函數的使用方法被B函數決定。一改B函數,A就錯
09/12 00:41, 20F

09/12 00:42, , 21F
了。
09/12 00:42, 21F

09/12 00:42, , 22F
針對性的函數,不能一體適用...
09/12 00:42, 22F

09/12 00:43, , 23F
這時候要考慮用class去做函數方法運用
09/12 00:43, 23F

09/12 00:43, , 24F
或是加入case control避免更動其中一部分的函數
09/12 00:43, 24F

09/12 00:44, , 25F
造成其他函數的結果出問題 或是 不正確運行
09/12 00:44, 25F

09/12 00:45, , 26F
這些都只是原則,沒有一定要怎麼做。好用好改就好。
09/12 00:45, 26F

09/12 00:45, , 27F
多謝c兄幫忙解釋。
09/12 00:45, 27F

09/12 00:46, , 28F
我上次看dr的原始碼看得很痛苦= =
09/12 00:46, 28F

09/12 00:47, , 29F
他東拆拆西拆拆都看不懂了...嘆氣...
09/12 00:47, 29F

09/12 00:48, , 30F
我有時候也不懂到底拆分出常用的CODE是否真的會
09/12 00:48, 30F

09/12 00:48, , 31F
比較好
09/12 00:48, 31F

09/12 00:49, , 32F
我知道至少在修改跟維護上面會方便很多
09/12 00:49, 32F

09/12 00:49, , 33F
在讀者眼中可能不見得是好事...
09/12 00:49, 33F

09/12 00:50, , 34F
可能兩個稍微不同的CASE用同一個函數處理
09/12 00:50, 34F

09/12 00:50, , 35F
可能要花很多時間去找相異之處
09/12 00:50, 35F

09/12 00:50, , 36F
一切真的是看每個人
09/12 00:50, 36F

09/12 00:59, , 37F
如果看到作者的UML,說不定就秒看懂了~
09/12 00:59, 37F

09/12 01:14, , 38F
所以應該建議r package在打包時做network
09/12 01:14, 38F
文章代碼(AID): #1LyQ9uEv (R_Language)
文章代碼(AID): #1LyQ9uEv (R_Language)