gpt4 book ai didi

r - data.table列删除速度

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

假设我有一个名为“数据”的大表。我想删除变量 cI 中引用的列。

这很快:

data = data[, eval(cI) := NULL]

这很慢:

data[, eval(cI) := NULL]

两种方法都有效(第二次使用没有打印出(或返回)完整的表格。是什么让第二种方法变慢了?显然,涉及到表格副本,但为什么呢?

谜团加深了。我试图测量系统时间,根据我如何计时,第二种方法有很大的不同:

> system.time(data <- data[, eval(dropI) := NULL])
user system elapsed
0.004 0.000 0.003
> system.time(data[, eval(dropI) := NULL])
user system elapsed
0.004 0.000 0.003
> date(); data[, eval(dropI) := NULL]; date()
[1] "Wed Jan 15 12:31:51 2014"
[1] "Wed Jan 15 12:31:58 2014"
> date(); data <- data[, eval(dropI) := NULL]; date()
[1] "Wed Jan 15 12:32:26 2014"
[1] "Wed Jan 15 12:32:26 2014"`

哦,我启用了 JIT 编译器(设置为 3)

最佳答案

为了解决这个问题,@eddi 和@joran 在评论中走在了正确的轨道上。

绝对没有速度差异:

data = data[, eval(cI) := NULL]

data[, eval(cI) := NULL]

因为,两者都立即执行,始终如一(0.000 秒)。另一个答案只是计时copy(dt),请看我的编辑。

顺便说一句,你不需要 eval,只需要括号就可以了:

data = data[, (cI) := NULL]

data[, (cI) := NULL]

发生的事情是您在控制台上输入这些命令。由于第一个是赋值,值 data 被无形地返回并且 R 不打印它。 R 会打印第二种方法的结果。

就像 data.frame 一样,DTprint(DT) 的输入速度存在巨大差异:

> DT          # very slow. R copies the whole of DT for some reason
> print(DT) # very fast. R doesn't copy DT.

在这个问题中,您得出的结论是副本被盗用了,您是对的。但是通过打印,而不是通过列删除。

也许是因为 DF 打印了整个 DF,所以速度太慢了,没有人注意到 R 在开始之前也复制了 DF将整个 DF 转换为字符形式。由于 DT 默认打印表格的顶部和底部,速度非常快,您会注意到 R 复制它需要多长时间。反正就是这样。

我不知道这是为什么,但已经知道有一段时间了。 R 的当前开发版本中有一些副本减少更改,我希望这些更改会减少在所谓的自动打印中获取的副本。

同时,显式调用print(DT),以实现内存高效打印!

关于r - data.table列删除速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21143828/

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