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