Как использовать список-аргумент в микробенчмарке

Как использовать список-аргумент в функции microbenchmark. Я хочу протестировать одну и ту же функцию с разными входными данными, как в

microbenchmark(j1 = {sample(1e5)},
               j2 = {sample(2e5)},
               j3 = {sample(3e5)})

Следующее не будет работать, так как список будет содержать только векторы, а не невычисленные выражения.

microbenchmark(list = list(j1 = {sample(1e5)},
                          j2 = {sample(2e5)},
                          j3 = {sample(3e5)))

Я также хотел бы создать список, используя, например. lapply.


person Tobias Madsen    schedule 05.10.2015    source источник


Ответы (2)


Просто используйте alist:

microbenchmark(list = alist(a = Sys.sleep(0.005), b = Sys.sleep(0.01)))
#> Unit: milliseconds
#>  expr      min       lq      mean    median        uq       max neval cld
#>     a  5.02905  5.15946  5.447538  5.446029  5.612429  6.030764   100  a 
#>     b 10.04997 10.18264 10.431011 10.459569 10.547814 11.058911   100   b

alist обрабатывает свои аргументы, как если бы они описывали аргументы функции. Таким образом, значения не оцениваются, и аргументы с тегами без значения допускаются, тогда как список просто игнорирует их.

person Hugh    schedule 07.01.2018

Нам нужно использовать функцию substitute или bquote, чтобы получить невычисленные выражения в списке, например.

microbenchmark(list = list(j1 = bquote({sample(1e5)}),
                           j2 = bquote({sample(2e5)}),
                           j3 = bquote({sample(3e5)})))

Задания можно генерировать с помощью lapply, но нужно быть осторожным с окружением.

jobs = lapply(1000*1:3, function(s) local({s = s; bquote(sample(.(s)))}) )
person Tobias Madsen    schedule 05.10.2015
comment
Вместо того, чтобы возиться с new.env(), вы можете просто поместить оператор внутри local: local({s = s; bquote(sample(.(s)))})bquote, и substitute работают, но я обычно предпочитаю bquote для удобочитаемости). На самом деле, этот простой случай работает даже без локальной среды (но это не обобщает): jobs = lapply(1000 * 1 : 3, function (s) bquote(sample(.(s)))). - person Konrad Rudolph; 05.10.2015
comment
Спасибо Конрад. Я отредактировал свой ответ. Это довольно интересные функции, о которых я не знал :) - person Tobias Madsen; 06.10.2015