假设隐式和显式打印之间的性能差异与对象大小相关是否安全?

时间:2015-03-25 01:10:32

标签: r

我编写了几种方法来生成网络类型对象,其中包含用于定义与公式或模型列表的关系的选项。在尝试调用我的打印方法时,我看到列表生成的对象与公式生成的对象之间的速度完全不同

setRepositories(ind=1:2)
#* Requires that you have JAGS installed
devtools::install_github("nutterb/HydeNet", ref="devel-brom")
library(HydeNet)

data(PE, package='HydeNet')

#* Object based on a formula 
autoNet <- HydeNetwork(~ wells
                       + pe | wells
                       + d.dimer | pregnant*pe
                       + angio | pe
                       + treat | d.dimer*angio
                       + death | pe*treat,
                       data = PE)

#* Object based on a list of models
g1 <- lm(wells ~ 1, data=PE)
g2 <- glm(pe ~ wells, data=PE, family="binomial")
g3 <- lm(d.dimer ~ pe + pregnant, data=PE)
g4 <- xtabs(~ pregnant, data=PE)
g5 <- glm(angio ~ pe, data=PE, family="binomial")
g6 <- glm(treat ~ d.dimer + angio, data=PE, family="binomial")
g7 <- glm(death ~ pe + treat, data=PE, family="binomial")

bagOfModels <- list(g1,g2,g3,g4,g5,g6,g7)
bagNet <- HydeNetwork(bagOfModels)

这些对象所基于的PE数据集本身相当大,而在网络的列表版本(bagNet)中,PE在所有七个模型对象。这肯定是气球的大小:

> object.size(autoNet)
397344 bytes
> object.size(bagNet)
26969592 bytes

现在,当我尝试打印对象时,执行打印所需的时间差别很大。 (我知道system.time,但它没有显示隐式打印的执行时间,所以我正在使用丑陋的工作,抱歉)

#* time to print autoNet
> a <- Sys.time()
> autoNet
> b <- Sys.time()
> b-a
Time difference of 0.172601 secs

#* Time to print bagNet
> a <- Sys.time()
> bagNet
> b <- Sys.time()
> b-a
Time difference of 33.53736 secs

#* Time to print bagNet explicitly
> a <- Sys.time()
> print(bagNet)
> b <- Sys.time()
> b-a
Time difference of 0 secs

在R-devel上有一个brief discussion,但它并没有说它是对象的大小正在减慢打印速度。我的假设是否正确?我只是想知道是否应该在我的软件包文档中推荐使用显式打印。

1 个答案:

答案 0 :(得分:1)

是的,但仅限于当前的R版本,而不是R-devel,它将在4月份作为R 3.2.0发布。直到最近,自动打印的实现以一种方式完成,当通过方法分派处理打印时导致对象被复制。现在已经解决了这个问题。