[Rd] reduce limit number of arguments in methods:::cbind
Yohan Chalabi
chalabi at phys.ethz.ch
Thu Dec 4 10:07:50 CET 2008
>>>> "JR" == "Jeff Ryan" <jeff.a.ryan at gmail.com>
>>>> on Wed, 3 Dec 2008 15:22:24 -0600
JR> My 2c:
JR>
JR> The real issue for me is that this approach to handling S4 objects by
JR> altering R functions for the worse is incorrect. (by calling
JR> bind_activation)
JR>
JR> m <- matrix(1:2e6L) # 2 million obs
JR> > system.time(cbind(m,m))
JR> user system elapsed
JR> 0.027 0.017 0.044
JR> > methods:::bind_activation(TRUE)
JR> [1] FALSE
JR>
JR> # the additional overhead of cbind is now damaging to cbind S3 methods
JR> > system.time(cbind(m,m))
JR> user system elapsed
JR> 0.043 0.034 0.077 [~175% of the original time]
JR>
JR> Wouldn't a better near-term approach involve writing S3 methods to dispatch on.
JR>
JR> > methods:::bind_activation(FALSE)
JR> > library(Matrix)
JR> > M <- Matrix(1:10)
JR> > cbind(M,M)
JR> M M
JR> [1,] ? ?
JR>
JR> > cbind.dgeMatrix <- function(..., deparse.level=1) methods:::cbind(..., deparse.level=deparse.level)
JR> > cbind(M,M)
JR> 10 x 2 Matrix of class "dgeMatrix"
JR> [,1] [,2]
JR> [1,] 1 1
JR> [2,] 2 2
JR> [3,] 3 3
JR> [4,] 4 4
JR> [5,] 5 5
JR> [6,] 6 6
JR> [7,] 7 7
JR> [8,] 8 8
JR> [9,] 9 9
JR> [10,] 10 10
JR>
JR> # this approach "does no harm" to regular S3 methods
JR> > system.time(cbind(m,m))
JR> user system elapsed
JR> 0.028 0.017 0.045
JR>
JR> Obviously this negates part of the S4 dispatch value, but that can be
JR> had by calling cbind2 directly.
JR>
JR>
JR> Jeff
There is no surprise that the default cbind function is faster because
it calls a C routine in contrast with methods:::cbind which reduces
the problem "self recursively" to two arguments.
if you try the patch I sent in my previous message, you will notice
that the problem you mentioned is essentially improved.
regards,
Yohan
More information about the R-devel
mailing list