2015-03-25 51 views
0

我已經寫了幾個方法來產生一個網絡類型的對象,其中有選項來定義與公式或模型列表的關係。當試圖調用我的打印方法,我看到一個列表,並通過公式假設隱式和顯式打印之間的性能差異與對象大小有關是否安全?

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 ,但它並沒有完全說出它是放慢打印速度的對象的大小。我的假設是否正確?我只是想知道我是否應該建議在我的包文檔中使用顯式打印。

+0

事實上,它恰恰相反:對「print」的調用比在控制檯上爲相同大小的對象輸入對象名稱快10倍。我不相信確定對象是什麼類別的開銷會解釋它。如果@哈德利無法弄清楚,那麼我懷疑這裏的大多數人都能夠回答它。 (其中一個回答是用哈丁利用'df'作爲客體名稱的輕微有趣,我把它當做寵物,但我幾乎放棄了提醒人們。) – 2015-03-25 03:25:02

回答

1

是的,但僅限於目前的R版本,而不是R-devel,它將在4月份以R 3.2.0發佈。直到最近,自動打印的實現方式還是通過方法調度來處理打印時導致對象被複制的方式。現在已經解決了。

相關問題