为什么data.frame的第一个元素的访问时间取决于其维度?

时间:2016-08-04 11:25:20

标签: r time-complexity

我对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

1 个答案:

答案 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