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



我已经编写了两个方法来生成一个网络类型对象,其中包含定义与公式或模型列表的关系的选项。当试图调用我的打印方法时,我看到列表生成的对象和公式生成的对象之间的速度截然不同

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对此进行了简短的讨论,但并没有说是对象的大小减缓了打印速度。我的假设正确吗?我只是想知道我是否应该建议在我的包文档中使用显式打印。

是的,但仅在当前的R版本中,而不是在R-devel中,R-devel将于4月发布为R 3.2.0。直到最近,自动打印的实现方式是在通过方法调度处理打印时导致对象重复。这个问题现在已经解决了。

最新更新