假设出于分析目的,我可以使用其中任何一个来评估记录变换或平方根变换数据是否更好?特别是,我试图了解在 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(文档?(和(2(更普遍?
例如,我想知道我上面尝试的一些失败是否是:
- 使用整数(浮点数的答案可能不同(
- 使用单调密集序列?
我最普遍的问题是,对于进行评估来说,什么很重要,我需要了解 R 或我的硬件才能以智能的方式提出这个问题?
谢谢!
使用基准测试包。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