我试图在没有一个"for“的情况下更有效地开发程序,但是当我删除一个循环时,时间就会增加。
我做错什么了?
请不要关注结果,因为这些数字是象征性的,我在"for“里面有更多的代码。我需要改进这条线:“问题线”。
尝试1需要1.7秒
尝试2需要9s
nSteps = 200; p=0.45
v = data.frame(matrix(0,nrow=nSteps+1,ncol=nSteps+1))
v[nSteps+1,] <- rep(0.2,nSteps+1)
check = data.frame(matrix(15,nrow=nSteps+1,ncol=nSteps+1))
#################
### attempt 1 ###
#################
for ( m in nSteps:0){
for (n in 1:(m+1)){
hold = (1-p)*v[m+1,n]+p*v[m+1,n+1] #### problem line
v[m,n] = ifelse(check[m,n]>=0,max(check[m,n],hold),max(hold,0))
# more code here...
}
}
#################
### attempt 2 ###
#################
seq1 = 1:nSteps
seq2 = 2:(nSteps+1)
for ( m in (nSteps:1)){
vec = (1-p)*v[m+1,seq1]+p*v[m+1,seq2] ##### problem line
v[m,]<-c(t(vec),0)
# more code here...
}发布于 2018-12-31 03:57:30
我快速地看了一下,似乎可以通过将data.frame更改为data.matrix来提高它的性能。
在一般矩阵中,性能要比数据帧好得多,请检查以下内容
https://csgillespie.github.io/efficientR/7-1-data-types.html#matrix
我不知道你想做什么.
例如,以下操作(标量乘以矩阵,乘以向量)使用数据矩阵显著加快
DF <- data.frame(a = 1:3, b = 4:6,c = 7:9)
V <- data.frame(a = 10:12)
dm <- data.matrix(DF)
dv <- data.matrix(V)
DFl <- list()
dml <- list()
system.time(
for ( m in 2500:1){
DFl[[m]] <-( 3 * DF * V[,1])
}
)
system.time(
for ( m in 2500:1){
dml[[m]] <- ( 3 * dm * dv[1])
}
)第一种情况,如果通过改变矩阵(大约快3倍)的速度大大加快的话。
运行以下返回
尝试1
用户系统运行
2.11 0.00 2.11
企图1a
用户系统运行
0.690.00 0.69
企图2
用户系统运行
8.60 0.00 8.63
尝试3
user system elapsed 0.02 0.00 0.02
比较结果
真的
library(compare)
nSteps = 200; p=0.45
v = data.frame(matrix(0,nrow=nSteps+2,ncol=nSteps+2))
#CS added extra row, looks like the logic was assuming that out of range DF returns NULL and errors subscript out of bounds on data.matrix
v[nSteps+1,] <- rep(0.2,nSteps+1)
vtemp <- v
check = data.frame(matrix(15,nrow=nSteps+1,ncol=nSteps+1))
#################
### attempt 1 ###
#################
v<- vtemp
system.time(
for ( m in nSteps:0){
for (n in 1:(m+1)){
hold = (1-p)*v[m+1,n]+p*v[m+1,n+1] #### problem line
v[m,n] = ifelse(check[m,n]>=0,max(check[m,n],hold),max(hold,0))
# more code here...
}
}
)
v1 <- v
#################
### attempt 1a ###
#################
v<- vtemp
check2 = matrix(15,nrow=nSteps+1,ncol=nSteps+1)
v1a <- data.matrix(v)
system.time(
for ( m in nSteps:0){
for (n in 1:(m+1)){
hold = (1-p)*v1a[m+1,n]+p*v1a[m+1,n+1] #### problem line
v1a[m,n] = ifelse(check[m,n]>=0,max(check[m,n],hold),max(hold,0))
# more code here...
}
}
)
v1a <- data.frame(v1a)
compare(v1,v1a)
#################
### attempt 2 ###
#################
v = data.frame(matrix(0,nrow=nSteps+1,ncol=nSteps+1))
v[nSteps+1,] <- rep(0.2,nSteps+1)
vtemp <- v
seq1 = 1:nSteps
seq2 = 2:(nSteps+1)
system.time(
for ( m in (nSteps:1)){
vec = (1-p)*v[m+1,seq1]+p*v[m+1,seq2] ##### problem line
v[m,]<-c(t(vec),0)
# more code here...
}
)
v2 <- v
#################
### attempt 3 ###
#################
seq1 = 1:nSteps
seq2 = 2:(nSteps+1)
v3 <- data.matrix(vtemp)
#note Matrix index is 0 based
system.time(
for ( m in (nSteps:0)){
vec = (1-p) * v3[m+1,seq1] + p * v3[m+1,seq2] ##### problem line
v3[m,]<-c(t(vec),0)
# more code here...
}
)
v3 <- data.frame(v3)
compare(v2,v3)https://stackoverflow.com/questions/53982339
复制相似问题