Speed Comparsion : for, apply, and colSum
R의 반복문의 속도 비교
동일한 반복 작업을 수행하는 여러 가지 다른 방법의 속도를 비교해 보면 속도의 순서는 대부분 다음과 같다.
R의 내장 함수 >
apply
>for
mat <- matrix(1:1000, 1000, 1000, byrow=T)
# R 내장 함수
result <- colSums(mat)
# apply
result <- apply(mat, 2, sum)
# for
result <- rep(NA, 1000) # result <- NA, length(result) <- 1000
for (i in 1:ncol(mat)) {
result[i] <- sum(mat[,i])
}
R의 과거 버전에서는 for
문을 쓰는 것보다 apply
을 쓰는 것이 압도적으로 빨랐다고 한다. 하지만 Hadley가 지적했듯이 최근 버전의 R에서는 for
문을 사용해도 성능 저하가 그리 크지 않다.
여기서 잠깐 실험을 해보자. 아래의 코드로 동일한 기능(행렬의 각 열을 합한다)을 하는 서로 다른 방법에 대한 소요 시간을 측정해 보면 다음과 같다.
mat <- matrix(1:1000, 1000, 1000, byrow=T)
result <- vector(mode="list", 1000)
# R 내장 함수
tColsum <- system.time({for (i in 1:1000)
result[[i]] <- colSums(mat)})
mat <- matrix(1:1000, 1000, 1000, byrow=T)
result <- vector(mode="list", 1000)
# for
tFor <- system.time(for(iter in 1:1000) {
result[[iter]] <- rep(NA, 1000) # result <- NA, length(result) <- 1000
for (i in 1:ncol(mat)) {
result[[iter]][i] <- sum(mat[,i])
}})
mat <- matrix(1:1000, 1000, 1000, byrow=T)
result <- vector(mode="list", 1000)
# apply
tApply <- system.time({for (i in 1:1000)
result[[i]] <- apply(mat, 2, sum)
})
colSums |
apply( , 2, sum) |
for |
|
---|---|---|---|
소요 시간(초) | 0.87 | 7.75 | 5.05 |
위의 결과를 보면 속도 순서는 첫 번째가 R에서 그 기능만을 위해 특별히 제작된 함수, 두 번째가 for
, 세 번째가 apply
이다. 이 경우에는 위에서 얘기한 일반적인 경우와 다소 큰 차이를 보인다. 따라서 속도가 중요한 경우에는 상황과 조건에 맞춰 모의 실험을 해보는 것이 좋을 것이다.
Leave a comment