gpt4 book ai didi

r - 为什么 R 中的求幂(例如 10^6)比计算器符号(例如 1e6)花费的时间长 4 倍?

转载 作者:行者123 更新时间:2023-12-02 13:29:59 26 4
gpt4 key购买 nike

在 R 代码中使用科学记数法 10^6(正如我习惯的那样)会导致比使用计算器表示法 1e6 更长的计算时间:

> system.time(for (t in 1:1e7) x=10^6) 
utilisateur système écoulé
4.792 0.000 4.281
> system.time(for (t in 1:1e7) x=1e6)
utilisateur système écoulé
0.804 0.000 1.051
> system.time(for (t in 1:1e7) x=exp(6*log(10)))
utilisateur système écoulé
6.301 0.000 5.702

为什么 R 重新计算 10^6 的时间与计算 exp{6*log(10)} 的时间大致相同?我知道 R 在计算 10^6 时执行一个函数,但为什么要这样编码?

最佳答案

这是因为 1e6constant ,并且被解析器识别为这样,而 10^6 被解析为必须进一步评估的函数调用(通过调用函数 ^() )。由于前者避免了函数调用的昂贵开销,因此评估它要快得多!

class(substitute(1e6))
# [1] "numeric"
class(substitute(10^6))
# [1] "call"

为了更好地看出这是一个调用,您可以像这样剖析它:

as.list(substitute(10^6))
# [[1]]
# `^`
#
# [[2]]
# [1] 10
#
# [[3]]
# [1] 6

其他一些有趣的案例:

## negative numbers are actually parsed as function calls
class(substitute(-1))
[1] "call"

## when you want an integer, 'L' notation lets you avoid a function call
class(substitute(1000000L))
# [1] "integer"
class(substitute(as.integer(1000000)))
# [1] "call"

关于r - 为什么 R 中的求幂(例如 10^6)比计算器符号(例如 1e6)花费的时间长 4 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30004331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com