我对data.frame
的第一个元素的访问时间有困难。访问时间似乎取决于data.frame
的大小。有谁知道如何消除这种依赖?
这是我运行的代码示例。它分配“tme”,可以节省设置data.frame
length
i*1000
的第一个元素所需的时间,其中i
从1到500运行。基本上,我分配更长和更长data.frames
,步长为1000,并将第一个元素设置为零。简而言之data.frames
访问时间远远低于可测量性,在长数组中它们上升到几秒钟。
tme <- (1:500)
for (j in 1:500){
i <- j*1000
vec <- (1:(i*1000))
print(i)
now <- Sys.time()
vec[1] <- 0
tme[j] <- Sys.time()-now
}
tme_vec_first <- tme
答案 0 :(得分:6)
我不认为时间的增加与访问时间有关,而是由于制作副本。这些任务中的每一项都涉及制作载体的副本。您可以使用tracemem
进行测试。
# initialize vector (10 zeros)
tracemem({vec <- integer(10)})
[1]&#34;&lt; 0000000011D48720&gt;&#34;
# assign value to 7th position
tracemem({vec[7] <- 6L})
tracemem [0x0000000011d48720 - &gt; 0x00000000111a02b0]:
[1]&#34;&lt; 0000000012E25468&gt;&#34;
随着向量变大,复制过程所涉及的时间也会增加。
此外,请注意vec <- (1:(i*1000))
是一个整数向量,vec[1] <- 0
将vec转换为双向量,这大约是内存中向量的两倍。
首先,我们将创建整数向量,并检查它的大小和类型。
# start over with similar syntax to question
tracemem({vec <- 1:10})
[1]&#34;&lt; 0000000011E55508&gt;&#34;
#check size object.size(VEC)
88字节
# check type
typeof(vec)
[1]&#34;整数&#34;
现在,将assign 0指定给第7个位置并重新检查大小和类型。 0似乎与最初的值相同,但实际上是一个double而不是整数。
# assign value
tracemem({vec[7] <- 0})
tracemem [0x0000000011e55508 - &gt; 0x0000000012399390]:
tracemem [0x0000000012399390 - &gt; 0x0000000013394740]:
[1]&#34;&lt; 00000000130EBA60&gt;&#34;
# check size
object.size(vec)
168字节
# check type
typeof(vec)
[1]&#34; double&#34;
请注意,这里有两个单独的复制说明。我的猜测是,第一个是将矢量从整数转换为double的副本,第二个是赋值。
要将向量保持为整数向量,请使用vec[1] <- 0L
代替&#34; L&#34;告诉R需要一个整数。
请注意,在使用带有Windows 7的MS R open 3.2.5时,Rstudio和Rgui都会观察到此复制行为tracemem
。