Сравнение скорости saply с составной функцией - PullRequest
4 голосов
/ 05 января 2011
> system.time(sapply(rnorm(1000000,0,1), function (x) round(x,2)))
   user  system elapsed 
   2.78    0.11    2.89 
> system.time(round(rnorm(1000000,0,1),2))
   user  system elapsed 
   0.29    0.00    0.30 

Я пробовал это после прочтения ответов на вопрос о подсказках.Я не ожидал, что sapply будет на порядок медленнее, чем эквивалентная составная функция в приведенном выше случае.Кто-нибудь знает, почему это так?Если я правильно понимаю, Саппи будет векторизоваться и будет почти оптимально быстрой.

Ответы [ 2 ]

5 голосов
/ 05 января 2011

вероятно, sapply, который является простой оболочкой для lapply, не векторизован. попробуйте этот код:

system.time(sapply(rnorm(10), function (x) {print(length(x)); round(x,2)}))

и посмотрите реализацию здесь: https://svn.r -project.org / R / trunk / src / main / apply.c

2 голосов
/ 05 января 2011

Здесь нет ничего, что можно применить - вы даете ему только один вектор, а не список векторов, а приложение sapply преобразует результат в матрицу (один столбец).

sapply упрощает результат для вас, но при этом должен генерировать массив.

Сравните, если вы дадите ему список:

system.time(sapply(list(rnorm(1000000,0,1)), function (x) round(x,2))) 
user  system elapsed 
 0.22    0.00    0.22 

system.time(sapply(rnorm(1000000,0,1), function (x) round(x,2))) 
user  system elapsed 
4.21    0.00    4.21 
...