코드가 느립니다!

효율적인 R 코드 작성

Colin Gillespie

Jumping Rivers & Newcastle University

코드가 정말 느린가요?

  • 1초?
  • 1분?
  • 1시간?
효율적인 R 코드 작성

코드가 정말 느린가요?

효율적인 R 코드 작성

벤치마킹

  1. 벤치마킹할 기능을 함수로 만듭니다.
  2. 다양한 시나리오(예: 데이터셋)에서 함수의 실행 시간을 측정합니다.
효율적인 R 코드 작성

예시: 숫자 수열

$$ 1, 2, 3, \ldots, n $$

옵션 1
1:n
옵션 2
seq(1, n)
옵션 3
seq(1, n, by = 1)
효율적인 R 코드 작성

함수 래핑

colon <- function(n) 1:n
colon(5)
1 2 3 4 5
seq_default <- function(n) seq(1, n)
seq_by <- function(n) seq(1, n, by = 1)
효율적인 R 코드 작성

system.time()으로 시간 측정

system.time(colon(1e8))
#   user  system elapsed
#  0.032   0.028   0.060
system.time(seq_default(1e8))
#   user  system elapsed
#  0.060   0.028   0.086
system.time(seq_by(1e8))
#   user  system elapsed
#  1.088   0.520   1.600
  • user 시간은 사용자 명령 실행에 사용된 CPU 시간입니다.
    • system 시간은 호출 프로세스를 위해 시스템이 사용한 CPU 시간입니다.
    • elapsed 시간은 user와 system의 합계로, 일반적으로 가장 중요한 값입니다.
효율적인 R 코드 작성

결과 저장

다음 코드의 문제점은

system.time(colon(1e8))

결과가 저장되지 않는다는 것입니다. 결과를 저장하려면 코드를 다시 실행해야 합니다.

res <- colon(1e8)

<- 연산자는 다음 두 가지를 모두 수행합니다:

  • 인수 전달
  • 객체 할당
system.time(res <- colon(1e8))

= 연산자는 다음 중 하나만 수행합니다:

  • 인수 전달
  • 객체 할당
# Raises an error
system.time(res = colon(1e8))
효율적인 R 코드 작성

상대 시간

방법 절대 시간(초) 상대 시간
colon(n) 0.060 $0.060/0.060 = 1.00$
seq_default(n) 0.086 $0.086/0.060 = 1.40$
seq_by(n) 1.607 $1.60/0.060 = 26.7$
효율적인 R 코드 작성

microbenchmark 패키지

  • 함수 비교
    • 각 함수를 여러 번 실행
library("microbenchmark")

n <- 1e8 microbenchmark(colon(n), seq_default(n), seq_by(n), times = 10) # Run each function 10 times
# Unit: milliseconds
#           expr  min   lq  mean  median   uq  max neval cld
#       colon(n)   59  130   220     202  341  391    10  a
# seq_default(n)   94  204   290     337  348  383    10  a
#      seq_by(n) 1945 2044  2260    2275 2359 2787    10   b
효율적인 R 코드 작성

연습해 봅시다!

효율적인 R 코드 작성

Preparing Video For Download...