2015-03-17 7 views
1

Я попытался измерить скорость этих двух способов для принятия квадратного корня:Почему ** 0,5 оказываются более эффективными, чем SQRT()

> system.time(expr = replicate(10000, 1:10000 ** (1/2))) 
## user system elapsed 
## 0.027 0.001 0.028 
> system.time(expr = replicate(10000, sqrt(1:10000))) 
## user system elapsed 
## 3.722 0.665 4.494 

Если функция sqrt() не может конкурировать с ** 0.5, почему нам нужна такая функция?

(система OS X Yusemite и R версия 3.1.2)

+0

См. «Синтаксис» для приоритета оператора. Экспоненциальность '^' имеет более высокий приоритет, чем оператор последовательности ':'. Сравнить '1: 4^(0.5)'; '1: (4^(0,5))'; '(1: 4)^(0,5)' – Henrik

+4

Прежде чем сравнивать два альтернативы, вы всегда должны проверить, что они дают одинаковые результаты. – Roland

ответ

13

Вы забыли важные скобки. Вот тайминги после коррекции, что:

system.time(expr = replicate(10000, (1:10000) ** (1/2))) 
#user system elapsed 
#4.76 0.32 5.12 
system.time(expr = replicate(10000, sqrt(1:10000))) 
#user system elapsed 
#2.67 0.57 3.31 
8

Чтобы добавить @ ответ Роланда, вы попали в Operators precedence «ловушку». ^ предшествует :** переводится в парсер ^» согласно документации ?"**")

Что произошло на самом деле является

`:`(1, 10000 ** (1/2)) 

Это означает, что вы впервые запустить ** и только потом 1:..

Совет для будущего, попробуйте отладить код перед запуском сложных операций, например, тестирование

1:5 ** (1/2) 
## [1] 1 2 
sqrt(1:5) 
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 

Выясните проблему.

+2

** - несколько распространенный способ указывать возведение в степень на других языках. Вероятно, именно так они и пришли. – Dason

+0

@Dason достаточно справедливо. –

 Смежные вопросы

  • Нет связанных вопросов^_^