R 第一个括号内的作业和完整作业一样耗时?
关于这一答复: 我们可以看到,在第一次使用R 第一个括号内的作业和完整作业一样耗时?,r,copy,lazy-evaluation,R,Copy,Lazy Evaluation,关于这一答复: 我们可以看到,在第一次使用改变向量时,[比较 编辑约书亚的评论:下面显示的行为仅限于R-studio!! 为了回答OP的问题,复制的根本原因(正如@MartinMorgan所解释的)是由于a的NAM(2)SEXP对象。如果第一个命令不包含system.time(.),那么a本身不回答您的问题,而是向它添加一些内容:如果您这样做头(a)在上次作业之前,您会发现正在制作副本。请尝试以下操作:system.time(a我无法在32位WinXP上的R-2.15.2或64位Ubuntu上
改变向量时,[比较
编辑约书亚的评论:下面显示的行为仅限于R-studio!!
为了回答OP的问题,复制的根本原因(正如@MartinMorgan所解释的)是由于a
的NAM(2)SEXP对象。如果第一个命令不包含system.time(.)
,那么a本身不回答您的问题,而是向它添加一些内容:如果您这样做头(a)
在上次作业之前,您会发现正在制作副本。请尝试以下操作:system.time(a我无法在32位WinXP上的R-2.15.2或64位Ubuntu上的R-2.15.3中复制这一点。哎呀,这是因为R-studio吗?我现在就试试R64。是的,这是R-studio正在做的。这里的解释是:是的,非常好。可能相关的部分以“但是,如果计算是通过从函数中返回命名值来完成的”开头在一个非常有趣的R-devel线程中,主题是如何/何时将NAMED的值设置为2。
> system.time(a <- rep(1L, 10^8))
user system elapsed
0.15 0.17 0.31
> system.time(a[222L] <- 111L)
user system elapsed
0.26 0.08 0.34
> system.time(a[333L] <- 111L)
user system elapsed
0 0 0
> a <- rep(1L, 10)
> .Internal(inspect(a))
@457b840 13 INTSXP g0c4 [NAM(1)] (len=10, tl=0) 1,1,1,1,1,...
> system.time(a <- rep(1L, 10))
[...]
> .Internal(inspect(a))
@4626f88 13 INTSXP g0c4 [NAM(2)] (len=10, tl=0) 1,1,1,1,1,...
> a <- rep(1L, 10^8)
> .Internal(inspect(a))
@7f972b571010 13 INTSXP g0c7 [NAM(1)] (len=100000000, tl=0) 1,1,1,1,1,...
> system.time(a[123L] <- a[321L])
user system elapsed
0 0 0
system.time(a <- rep(1L, 10^8))
# user system elapsed
# 0.256 0.263 0.526
.Internal(inspect(a))
# @10745d000 13 INTSXP g0c7 [NAM(2)] (len=100000000, tl=0) 1,1,1,1,1,...
system.time(a[222L] <- 111L)
# user system elapsed
# 0.299 0.199 0.498
.Internal(inspect(a))
# @11f1d6000 13 INTSXP g0c7 [NAM(1)] (len=100000000, tl=0) 1,1,1,1,1,...
system.time(a[333L] <- 111L)
# user system elapsed
# 0 0 0
.Internal(inspect(a))
# @11f1d6000 13 INTSXP g1c7 [MARK,NAM(1)] (len=100000000, tl=0) 1,1,1,1,1,...
system.time(a <- rep(1L, 10^8))
# user system elapsed
# 0.256 0.265 0.588
>
.Internal(inspect(a))
# @10745d000 13 INTSXP g0c7 [NAM(2)] (len=100000000, tl=0) 1,1,1,1,1,...
system.time(a[222L] <- 111L)
# user system elapsed
# 0.302 0.204 0.559
.Internal(inspect(a))
# @11f1d6000 13 INTSXP g0c7 [NAM(2)] (len=100000000, tl=0) 1,1,1,1,1,...
system.time(a[333L] <- 111L)
# user system elapsed
# 0.296 0.208 0.504
>
.Internal(inspect(a))
# @10745d000 13 INTSXP g0c7 [NAM(2)] (len=100000000, tl=0) 1,1,1,1,1,...