[问题] 在function中引function比较慢, why?

楼主: Edster (Edster)   2018-04-04 06:33:52
效能咨询(我想让R 跑更快)
[问题叙述]:
在function中引function, 主要是为了好读好修. 可是这样就很慢.
请问有什么方式加速吗? 例如引用的方法?
[程式范例]:
fun0 = function(fun){
x=1:10
y=10:1
fun1 = function(x,y){z=xy}
fun2 = function(x,y){z=x*y}
if(fun == "plus") z = fun1(x,y) else{
if(fun == "product") z = fun2(x,y)
}
return(z)
}
system.time(for(i in 1:1e7) fun0("product"))
user system elapsed
12.70 0.00 12.72
#
作者: locka (locka)   2018-04-04 11:22:00
推,同样也有这问题
作者: obarisk (OSWALT)   2018-04-04 12:11:00
做 profile 看看吧
作者: celestialgod (天)   2018-04-04 16:41:00
应该是每次都redefine fun1,fun2造成的overhead吧这种overhead在小量重复的时候不明显,但是大量循环的时候这一点点差距就会显得很大https://goo.gl/1pKq3h
楼主: Edster (Edster)   2018-04-04 18:38:00
我试过先定义function在全域变量, 结果一样花1.7倍时间改了自己的code让它比较好读, 结果等到天荒地老.并不是redefine function的问题. 而是只要再引用就会这样.
作者: celestialgod (天)   2018-04-04 19:09:00
function call overheadhttps://goo.gl/EaU9G2
作者: Wush978 (拒看低质媒体)   2018-04-04 21:57:00
可以用compiler::cmpfun加速,我测试过后,就一样快了Hmm... 我加大replication后发现compiler::cmpfun没有比较快...
作者: celestialgod (天)   2018-04-04 22:01:00
Wush我试过cmpfun了XDDD
作者: Wush978 (拒看低质媒体)   2018-04-04 22:02:00
不过你应该可以用function of function来避免redefinefunction
作者: obarisk (OSWALT)   2018-04-04 22:32:00
为什么 function call 会让 code 比较好读?改 pure function 都不会比较好读了...改一下 code style 并加上适当的注解比较合理myfun <- function(x, y, op) do.call(op, list(x, y))myfun(1, 2, `+`)myfun(1, 2, `*`)不晓得这样的 code 有没有比较清础myfun <- function(x, y, op) op(x, y)不用 do.call
作者: celestialgod (天)   2018-04-04 23:04:00
他那个应该只是举例而已,fun1,fun2应该很长
作者: obarisk (OSWALT)   2018-04-04 23:48:00
我也只是举例而已,概念上应该要写这种 function 才有帮助,要把变量参数化,否则两个很长的 function 怎么会比较好读

Links booklink

Contact Us: admin [ a t ] ucptt.com