假设对分析目的既可以使用对数变换又可以对平方根变换数据进行记录,那么这是一种更好的方法来评估对数变换还是平方根变换数据呢?特别是,我试图了解在R中是否重要,如果我选择应用log
或sqrt
来转换数据,以及是否依赖于数据的性质,总体尺寸等。
这是我最初使用的代码:
start.time = Sys.time()
for (x in 1:10000)
log(x)
end.time = Sys.time()
print(end.time - start.time)
start.time = Sys.time()
for (x in 1:10000)
sqrt(x)
end.time = Sys.time()
print(end.time - start.time)
但是,然后我开始怀疑它是否取决于数据的性质,因此我尝试了各种变化,例如增大或减小值的密度:
start.time = Sys.time()
for (x in 1:10000000)
log(x^8)
end.time = Sys.time()
print(end.time - start.time)
start.time = Sys.time()
for (x in 1:10000000)
sqrt(x^8)
end.time = Sys.time()
print(end.time - start.time)
在我尝试过的情况下,sqrt
总是比log
快一点,但是我没有测试效率/复杂度的经验,想知道是否有“正确”的答案方式这个问题(1)尤其是R(docs?),更普遍的是(2)这个问题?
例如,我想知道我上面尝试过的一些失败是否是
我最普遍的问题是进行评估的重要性,我需要关于R或我的硬件的什么知识才能以一种聪明的方式提出这个问题?
谢谢!
答案 0 :(得分:4)
使用基准测试包。 R有一些。我推荐microbenchmark
。阅读其文档以获取有关基准测试的一些想法。
玩。不要过于重视优化。始终考虑必须考虑的智力开销。
例如:
library(microbenchmark)
x <- (1:1e6)^8
y <- runif(1e6)
z <- sort(y)
microbenchmark(log(x), sqrt(x), log(y), sqrt(y), log(z), sqrt(z), times=10)
#> Unit: milliseconds
#> expr min lq mean median uq max neval cld
#> log(x) 45.778425 46.21116 46.46333 46.40788 46.90995 46.99119 10 b
#> sqrt(x) 9.576967 11.30364 11.97100 11.99424 12.39120 16.09995 10 a
#> log(y) 58.630950 60.16966 60.68071 60.67257 61.53909 62.02924 10 c
#> sqrt(y) 9.557819 11.09652 15.95161 11.97811 12.42969 55.37263 10 a
#> log(z) 46.039493 46.17527 46.34378 46.33622 46.43773 46.81620 10 b
#> sqrt(z) 11.111878 11.15454 11.77100 11.61037 12.35596 12.43116 10 a