yihui 用prod()就有点浪费了,一般人可能觉得这无所谓,表面上看起来是等价的,但背后的运算还是有区别的,用R的时候尽量用已经编好的函数,它们的计算都是经过优化的,尤其在大型计算中会节省不少时间。 比如你试试看这两句话分别要耗费多长时间: > system.time(replicate(1000000,factorial(170))) > system.time(replicate(1000000,prod(1:170)))
cloud_wei 运行了一下,factorial()真的比prod()耗时要短,原来简单的乘法运算都可以优化,不知factorial()是怎么优化的?另外,system.time(replicate(1000000,gamma(171)))运行的时间比factorial()和prod()都要短好多,又是怎么回事?
yihui 这倒不是什么真正的优化问题,搞计算机的人早把一些最基本的运算都用最高效的方法+最高效的语言写出来了,尽量用原汁原味的函数,而不要用表面上看起来等价但实际上是绕弯路的方法。(类似的例子还有例如log(x)或exp(x),理论上你可以用Taylor expansion来做,但除非你是专门研究数值计算的,你很难知道这样做有些什么问题)
wumaths 三个函数,factorial和gamma都是调用一个参数即可。 而prod里面的部分虽说是向量部分,但是也要多次运算,速度自然慢了下来。 至于阶层函数和gamma函数的速度差异,这与内部算法的速度有关系。
rtist 阶乘是个比较棘手的问题,能避免的时候尽量避免——它增长得实在太快了!通常大家认为指数增长都是快的不可接受的,阶乘比指数还快,稍不注意就大得没法用通常方法表示了。 但是统计中很多情况下都不需要它,比如最常见的就是在choose中和beta中,他们的增长都不是很快的,可处理的范围也大得多。另外取对数lfactorial, lgamma,etc.也可以缓解这样的问题。
Rogue.R [未知用户] 刚刚开始学习R的时候,试着完成过类似函数,但是效率都非常非常低。 :blush: 循环的表达 factorial <-function(x) { y <- 1 for (i in 1:x) y=y*i print (y) } 递归的表达方式 factorial <- function(x) { y=1 if (x >1) return (y=x*factorial(x-1)) else print(y) }