Еще один момент заключается в том, что во встроенных R-функциях часто содержится много «упаковочного» материала, который выполняет проверку ошибок, переупорядочивает данные и т.д.передача на lm.fit
и glm.fit
соответственно для фактического сокращения числа.В вашем конкретном случае cor
вызывает .Internal(cor(x, y, na.method, FALSE))
для корреляции Пирсона.Если (1) вам действительно нужна скорость и (2) вы хотите самостоятельно упорядочить данные и отказаться от проверки ошибок, иногда вы можете сэкономить время, вызвав внутреннюю функцию самостоятельно:
library(rbenchmark)
x <- y <- runif(1000)
benchmark(cor(x,y),.Internal(cor(x,y,4,FALSE)),replications=10000)
test replications elapsed relative user.self
1 cor(x, y) 10000 1.131 5.004425 1.136
2 .Internal(cor(x, y, 4, FALSE)) 10000 0.226 1.000000 0.224
Но, опять же, это зависит: мы не выигрываем много, когда матрицы большие, как в примере выше (так что время, потраченное на проверку ошибок относительно выполнения вычислений, намного больше) ...
x <- y <- rnorm(5e5)
benchmark(cor(x,y),.Internal(cor(x,y,4,FALSE)),replications=500)
test replications elapsed relative user.self
1 cor(x, y) 500 5.402 1.013889 5.384
2 .Internal(cor(x, y, 4, FALSE)) 500 5.328 1.000000 5.316