f <- function(n){
s <- 0
for (i in 1:n){
s <- s + (i/2)
}
print(s)
}
棘手的部分当然是s
递归依赖于前一个循环..
[编辑]
感谢您的回答。我只是试图使用R中的矢量化与循环相比来验证性能的增量。
当n = 1000000000时,上述函数需要287秒,而sum((1:n)/2)
和sum(seq_len(n)/2)
都返回一个错误,系统“无法分配大小为7.5 Gb的向量”
为了比较,Julia中的相同函数(n = 1000000000)需要38秒(0.87定义s
的类型),在C ++中使用2.48秒/0.87进行优化编译,在Python中使用98秒/ 0.88 numba装饰者。
答案 0 :(得分:7)
你可以这样做(如果是n>0
):
sum(seq_len(n)/2)
f(10)
#[1] 27.5
sum(seq_len(10)/2)
#[1] 27.5
如果n<0
:
sum((1:n)/2)
n <- -11
f(n)
#[1] -32.5
sum((1:n)/2)
#[1] -32.5
只是一个快速的基准测试:
library(microbenchmark)
n <- 10000
f1 <- function(n) sum(seq_len(n)/2)
f2 <- function(n){ s <- 0;for (i in 1:n){s <- s + (i/2);};s}
f1(n)==f2(n)
# [1] TRUE
microbenchmark(f1(n), f2(n))
# Unit: microseconds
# expr min lq mean median uq max neval
# f1(n) 20.733 22.235 27.51751 22.836 24.639 82.028 100
# f2(n) 3971.008 4275.383 4517.52582 4484.510 4648.867 5867.272 100
答案 1 :(得分:2)
n<-10
print(sum((1:n)/2))