programing

R 단위로 함수 실행 시간 측정

bestprogram 2023. 6. 6. 10:27

R 단위로 함수 실행 시간 측정

R에서 기능의 실행 시간을 측정하는 표준화된 방법이 있습니까?

분명히 나는 받아들일 수 있습니다.system.time실행 전과 실행 후에 차이를 취하지만, 표준화된 방법이나 기능이 있는지 알고 싶습니다(바퀴를 발명하지 않기를 원합니다).


저는 아래와 같은 것을 사용한 적이 있다는 것을 기억하는 것 같습니다.

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction

이를 수행하는 또 다른 방법은 Sys.time()을 사용하는 것입니다.

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

위의 답변과 비교했을 때, 가장 우아한 방법은 아니지만, 확실히 할 수 있는 방법입니다.

기능 내장기입니다.system.time()할 것입니다.

다음과 같은 용도:system.time(result <- myfunction(with, arguments))

말했듯이, 앤리가말이했듯드,,system.time()잘 작동합니다.짧은 기능을 위해서는 더 선호하는 것이 있습니다.replicate()그 안에서:

system.time( replicate(10000, myfunction(with,arguments) ) )

microbenchmark를 벤치마킹하기 50kB) 패키지입니다.

microbenchmark(myfunction(with,arguments))

예:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

여기서 두 표현식은 평균 실행 시간이 약 25-30ns인 10000회 평가되었습니다.

실행 시간을 측정하는 더 좋은 방법은 rbenchmark 패키지를 사용하는 것입니다.이 패키지를 사용하면 테스트를 복제할 횟수와 상대 벤치마크를 지정할 수 있습니다.

stats.stackexchange의 관련 질문도 참조하십시오.

▁is도 있습니다.proc.time()

다음과 같은 방법으로 사용할 수 있습니다.Sys.time에게 하만그당유결줍과니를다사한게신과 .system.time.

ptm <- proc.time()
#your function here
proc.time() - ptm

사용하는 것 사이의 주요 차이점

system.time({ #your function here })

은 게그바로입니다.proc.time()메소드는 단지 시간을 측정하는 대신 여전히 당신의 기능을 실행합니다...그리고 그건 그렇고, 나는 사용하는 것을 좋아합니다.system.time와 함께{}안에 물건들을 넣을 수 있도록...

패키지 "tictoc"은 실행 시간을 측정하는 매우 간단한 방법을 제공합니다.설명서는 https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf 에 있습니다.

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

경과된 시간을 변수에 저장하려면 다음 작업을 수행합니다.

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic

다른 솔루션은 단일 기능에 유용하지만 보다 일반적이고 효과적인 다음 코드를 권장합니다.

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))

또 입니다.profvis코드 실행 시간만 측정하는 것이 아니라 실행하는 각 기능에 대한 드릴다운 기능을 제공합니다.Shiny에게도 사용할 수 있습니다.

library(profvis)

profvis({
  #your code here
})

몇 가지 예를 보려면 여기를 클릭하십시오.

스타일의 MATLAB을 할 수 .tic-toc원하는 경우 함수를 선택합니다. SO » SO »

R의 스톱워치 기능

사용할 수 있습니다.Sys.time()파일에 때 "csv"라고 말할 .end - start대신 다음 단위를 정의해야 합니다.

f_name <- function (args*){
start <- Sys.time()
""" You codes here """
end <- Sys.time()
total_time <- as.numeric (end - start, units = "mins") # or secs ... 
}

그러면 사용할 수 있습니다.total_time적절한 형식을 가지고 있습니다.

위의 모든 답변에서 저는 이러한 단순화된 틱톡 기능을 사용하기 위해 올라왔습니다.

tic <- function(){ start.time <<- Sys.time() }
toc <- function(){ round(Sys.time() - start.time) }

다음 용도로 사용:

tic()
Sys.sleep(3)
toc()

다음과 같은 항목이 인쇄됩니다.

3초의 시차

벤치 패키지 웹 사이트 기준:

bench::mark()됩니다.bench하나 또는 일련의 표현식을 벤치마킹하는 데 사용되므로 대안에 비해 여러 가지 이점이 있다고 생각합니다.

  • 항상 각 운영 체제에 대해 사용할 수 있는 최고 정밀도 API(대개 나노초)를 사용합니다.
  • 각 식에 대한 메모리 할당을 추적합니다.
  • 식 반복당 R 가비지 컬렉션의 수와 유형을 추적합니다.
  • 부등식 코드를 실수로 벤치마킹하지 않도록 식 결과의 동일성을 기본적으로 확인합니다.
  • 가지다bench::press()이를 통해 대규모 가치 그리드에서 벤치마크를 쉽게 수행하고 결합할 수 있습니다.
  • 기본적으로 적응형 중지를 사용하며, 지정된 반복 횟수가 아닌 설정된 시간 동안 각 식을 실행합니다.
  • 식은 일괄 실행되며 요약 통계는 가비지 컬렉션을 사용하여 반복을 필터링한 후 계산됩니다.이를 통해 가비지 수집의 성능과 실행 시간에 미치는 영향을 분리할 수 있습니다(자세한 내용은 Neal 2014 참조).

시간과 메모리 사용량은 표시(예: 104ns) 및 비교(예: x$mem_alloc > "10MB")를 위해 인간이 읽을 수 있는 형식을 갖는 사용자 지정 개체로 반환됩니다.

또한 사용자 정의 척도 및 형식 지정을 포함하여 ggplot2를 사용한 그림 그리기를 완전히 지원합니다.

사용:

bench::mark(log10(5))
#> # A tibble: 1 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 log10(5)      212ns    274ns  2334086.        0B        0

2021-08-18에 reprex 패키지에 의해 생성됨 (v2.0.1)

두 개의 차이를 취하는 것을 언급하는 몇 가지 대답이 있습니다.Sys.time() s, 즉

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
end - start

이렇게 하면 결과가 "2초의 시차"와 같이 사람이 읽을 수 있는 형식으로 인쇄됩니다.그러나 단위가 다를 수 있기 때문에(예: "초"에서 "분"에서 "일"까지) 단위가 다를 경우 동일한 기준으로 여러 런타임을 비교하는 것이 유용하지 않습니다.

대화형이 아닌 경우 시간 단위를 지정하는 것이 좋습니다.

구체적으로.Sys.time()를 반환합니다.POSIXct물건.둘의 차이를 취하는 것.POSIXct수업의 목적을 부여합니다.difftime속성이 "sublish"인 경우.`-`운영은, 특히, 사용하도록 정의됩니다.difftime()와 함께 사용할 경우POSIXct.그것은,

time2 - time1

와 동등합니다.

difftime(time2, time1)

단위 속성을 지정하려면 다음을 추가합니다.units=논쟁, 예를 들어.

difftime(time2, time1, units="secs")

요약하면, 사용할 수 있습니다.Sys.time()지정된 단위(초, 분 등)로 런타임을 측정합니다.

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
difftime(end, start, units="secs")
library(rbenchmark)

sleep_func <- function() { Sys.sleep(0.5) }

benchmark(sleep_func())

아웃:

 test replications elapsed relative user.self sys.self user.child sys.child

1 sleep_func()          100   50.08        1      0.02        0         NA        NA

언급URL : https://stackoverflow.com/questions/6262203/measuring-function-execution-time-in-r