21

在 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,但为什么要这样编码?

4

2 回答 2

35

这是因为1e6是一个常量,并且被解析器识别为常量,而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"
于 2015-05-02T15:59:22.433 回答
7

1e6您指定文字数值的情况下。那里没有发生计算。

当您请求 时10^6,R 会执行将 10 提高到 6 次方的工作。是^一个数字运算符。它对 base 10 没有任何特殊作用。它不知道 和 之间的10^6区别12^14。它必须进行计算才能找到答案。

于 2015-05-02T15:59:08.980 回答