y*******y 发帖数: 163 | 1 之前看到过很多次说R里面for loop非常的不efficient, 很多人建议用apply,sapply
,lapply...
可是我最近做的一个simulation看来好像不是这样的, 用两个for loop (1000*1000)
写的程序运行了5个小时, 每个循环都是用lm fit model. 改成sapply和replicate以后
只提高了两三分钟...
有大牛给解答一下吗?多谢 | z**k 发帖数: 378 | 2 我猜想大家说的R中loop不够快是因为大量的dynamic memory allocation,就算是用C/
C++写,
malloc和new用多了速度也上不去。
至于你的问题,我怀疑你的code大量时间都被用在fit lm上了,你应该把程序分开,time一下
1000**2次lm的耗时和其余code的耗时,如果真的是因为lm,那你用再怎么改进code也没办法。
sapply
【在 y*******y 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 之前看到过很多次说R里面for loop非常的不efficient, 很多人建议用apply,sapply : ,lapply... : 可是我最近做的一个simulation看来好像不是这样的, 用两个for loop (1000*1000) : 写的程序运行了5个小时, 每个循环都是用lm fit model. 改成sapply和replicate以后 : 只提高了两三分钟... : 有大牛给解答一下吗?多谢
| z**k 发帖数: 378 | 3 > system.time({
+ x <- 1
+ for (i in 1:10000)
+ x[i] <- i
+ })
user system elapsed
0.36 0.00 0.36
>
>
> system.time({
+ x <- numeric(10000)
+ for (i in 1:10000)
+ x[i] <- i
+ })
user system elapsed
0.03 0.00 0.03
> | s*****n 发帖数: 2174 | 4 这些apply的overhead cost比较高, 所以对于循环体简单的loop, 未必会比for loop快
, 很多时候更慢, 比如:
> system.time(for (i in 1:100000) {1+1})
[1] 0.11 0.00 0.11 NA NA
> system.time(lapply(1:100000, function(i) {1+1}))
[1] 0.18 0.00 0.19 NA NA
如果仅仅是用apply来代替循环, 意义可能不是很大. 大多数apply都是用于某种直接的
计算, 很方便.
在几个apply当中, lapply是最基本的, sapply, tapply, apply本质上都是lapply的包
装, 大多数时候lapply稍快一些, 但是另外几个往往看上去更简洁. 比如:
> data <- data.frame(
+ id = rep(1:1000, each = 1000),
+ value = rnorm(1000 * 1000)
+ )
>
> system.time(unlist(lapply(spl | y*******y 发帖数: 163 | 5 啊,多谢ls的两位,版上大牛真多,以后要多多来学习 | g********r 发帖数: 8017 | 6 每个循环内部时间太长。如果多核,用foreach()比较划算。
sapply
【在 y*******y 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 之前看到过很多次说R里面for loop非常的不efficient, 很多人建议用apply,sapply : ,lapply... : 可是我最近做的一个simulation看来好像不是这样的, 用两个for loop (1000*1000) : 写的程序运行了5个小时, 每个循环都是用lm fit model. 改成sapply和replicate以后 : 只提高了两三分钟... : 有大牛给解答一下吗?多谢
| s*r 发帖数: 2757 | 7 foreach已经可以利用多核啦?
【在 g********r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 每个循环内部时间太长。如果多核,用foreach()比较划算。 : : sapply
| g********r 发帖数: 8017 | 8 当然了。比用单核快多了。有时候受到内存带宽的限制。直接当for loop效果不好,要
自己把工作分成几份,减少各个进程和主进程的交流。
【在 s*r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : foreach已经可以利用多核啦?
|
|