【问题标题】:Fair test of computational cost of log vs. sqrtlog 与 sqrt 的计算成本的公平测试
【发布时间】:2018-12-05 12:03:11
【问题描述】:

假设出于分析目的,我可以使用其中任何一种,那么评估记录变换数据还是平方根变换数据是否更好的公平方法是什么?特别是,我试图了解在 R 中,如果我选择应用 logsqrt 来转换数据是否重要,如果是这样,是否取决于数据的性质、整体大小等。

这是我最初使用的代码:

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 或我的硬件以智能方式提出这个问题?

谢谢!

【问题讨论】:

    标签: r performance complexity-theory arithmetic-expressions


    【解决方案1】:

    使用基准测试包。 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
    

    【讨论】:

    • “不要把优化看得太认真。”仅此一点就值得点赞。
    • 我不反对这个建议,但我想我想知道是否有任何经验法则需要注意。感谢您的包裹推荐!
    • 在 R 中,我会说你不应该担心数学函数等基本问题。知识渊博的人在实施它们方面做得很好。您需要注意的是您自己开发的算法。 R 中的主要经验法则是:尽量不要动态增长对象(例如,在循环中使用像 x &lt;- c(x, new_val) 这样的语句。否则取决于情况。糟糕的算法在大多数语言中都会变得糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多