Бенчмарк анализ и показване на резултатите от анализ И бенчмарк?

Вероятно просто съм пропуснал параметър... но може би някой може да ме насочи към него: Как мога да изпълня анализ в R сравнителен анализ и пак да съхраня резултата някъде?. Знам, че R функциите могат да върнат само един обект, но бих могъл или да използвам списък тук, или да поставя резултатите от бенчмарка и да съхраня анализа в върнатата стойност на функцията.

Но има ли някакъв начин да се оцени бенчмарк (или system.time) и анализ, без да се изпълнява два пъти по този начин?:

require(rbenchmark)
bmark <- function(x){
    res <- list()
    res[[1]] <- benchmark(x^6)
    res[[2]] <- x^6
    res
}

РЕДАКТИРАНЕ: Съжалявам, че предизвиках известно объркване относно това, което наистина искам да направя. Може би случаят на използване го прави по-ясен: нямам типична сравнителна ситуация, в която искам да проверя дали моята персонализирана функция е по-бърза от друга функция. По-скоро изпълнявам едно и също нещо с различни данни на различни машини. Нямам нужда от това в тестова среда, а в производствена – просто искам да уведомя потребителите на скрипта колко време е отнело. Ако това е час или повече, хората могат да планират обедната си почивка :) .


person Matt Bannert    schedule 18.02.2013    source източник


Отговори (3)


Ето пример с две функции. Първият използва plyr, а вторият използва data.table.

# dummy data
require(plyr)
require(data.table)
set.seed(45)
x1 <- data.frame(x=rnorm(1e6), grp = sample(letters[1:26], 1e6, replace=T))
x1.dt <- data.table(x1, key="grp")
# function that uses plyr   
DF.FUN <- function(x) {
    ddply(x1, .(grp), summarise, m.x = mean(x))
}

# function that uses data.table
DT.FUN <- function(x) {
    x1.dt[, list(m.x=mean(x)),by=grp]
}

require(rbenchmark)
> benchmark( s1 <- DF.FUN(), s2 <- DT.FUN(), order="elapsed", replications=2)

#             test replications elapsed relative user.self sys.self user.child sys.child
# 2 s2 <- DT.FUN()            2   0.036    1.000     0.031    0.006          0         0
# 1 s1 <- DF.FUN()            2   0.527   14.639     0.363    0.163          0         0

Сега s1 и s2 съдържат резултатите от всяка функция и сравнителните резултати ще бъдат показани на екрана.

# > head(s1)
#   grp           m.x
# 1   a  0.0069312201
# 2   b -0.0002422315
# 3   c -0.0129449586
# 4   d -0.0036275338
# 5   e  0.0013438022
# 6   f -0.0015428427

# > head(s2)
#    grp           m.x
# 1:   a  0.0069312201
# 2:   b -0.0002422315
# 3:   c -0.0129449586
# 4:   d -0.0036275338
# 5:   e  0.0013438022
# 6:   f -0.0015428427

Това ли преследвахте?

person Arun    schedule 18.02.2013
comment
Тествам и data.table е 20 пъти по-бърз :) +1 дори ако трябва да инсталираме 2 пакета:) - person agstudy; 18.02.2013

Прочетох въпроса малко по-различно от Арун. Това би бил отговорът на това, което мислех, че е зададен въпросът:

 > bres <- bmark(2)
> bres
[[1]]
  test replications elapsed relative user.self sys.self user.child sys.child
1  x^6          100   0.001        1     0.001    0.001          0         0

[[2]]
[1] 64

Функцията bmark връща резултат със 100 репликации по подразбиране. Ако искате да анотирате резултатите, можете да използвате paste() и ако искате да добавите параметър за брой повторения:

bmark2 <- function(x, reps=100){
    res <- list()
    res[[1]] <- benchmark(x^6, replications=reps)
    res[[2]] <- paste(reps, " replications of ", x, "to the 6th in", res[[1]]$elapsed)
    res
}
person IRTFM    schedule 18.02.2013
comment
Благодаря ви за отговора +1, наистина това е много близо и помага, просто не се нуждая от репликации тук. Редактирах въпроса си, за да (надявам се) да направя нещата по-ясни. - person Matt Bannert; 19.02.2013

Не съм сигурен какво мисли StackOverflow относно отговорите на стари въпроси, но изглежда, че никой всъщност не е отговорил след вашата редакция. Ето го:

За време на процес в R можете да използвате два метода. Първият използва system.time(expression) и ви дава колко време е отнело оценката на израза в скобите. Ако това не е практично във вашия случай, можете да получите системно време с Sys.time() преди операцията и след операцията и да извадите двете.

Ако това най-накрая отговаря на въпроса ви, моля, приемете решението :)

person Gullydwarf    schedule 17.11.2014