R:使用class属性列出元素的赋值
我在S3和S4类的上下文中进行了一些评测,并观察到以下内容: 与对应的普通列表上的相同操作相比,对S3对象元素的简单值赋值要慢2-3倍 在我看来,S3类是一个带有附加属性的列表,元素只是一个数字。那么,哪些机制会消耗额外的时间呢R:使用class属性列出元素的赋值,r,performance,list,oop,R,Performance,List,Oop,我在S3和S4类的上下文中进行了一些评测,并观察到以下内容: 与对应的普通列表上的相同操作相比,对S3对象元素的简单值赋值要慢2-3倍 在我看来,S3类是一个带有附加属性的列表,元素只是一个数字。那么,哪些机制会消耗额外的时间呢 value <- 1 obj_list <- list( a = 0 ) obj_s3 <- structure( obj_list, class = "myclass" ) system.time( replicate( 100000, o
value <- 1
obj_list <- list( a = 0 )
obj_s3 <- structure( obj_list, class = "myclass" )
system.time(
replicate( 100000, obj_list$a <- value)
) # ~180 ms
system.time(
replicate( 100000, obj_s3$a <- value)
) # ~420 ms
value一旦将类添加到R变量中,就将其作为受S3调度的对象。因为$答案正确,但函数错误。你链接到的那篇博文很有趣,$!
/* From src/main/subassign.c
$<-(x, elt, val)
*/
SEXP attribute_hidden do_subassign3(SEXP call, SEXP op, SEXP args, SEXP env)
{
// ... code omitted
if(DispatchOrEval(call, op, "$<-", args, env, &ans, 0, 0))
return(ans);
// ... code omitted
}
> mean
function (x, ...)
UseMethod("mean")
<bytecode: 0x000000000fd151c0>
<environment: namespace:base>
mean(obj) => UseMethod() => find method => mean.default(obj)
> obj <- structure(1:10, class="wookkawooka")
> var <- 1:10
>
> library(microbenchmark)
> microbenchmark(mean(obj), mean(var), mean.default(obj))
Unit: microseconds
expr min lq mean median uq max neval
mean(obj) 12.069 13.166 16.46442 13.166 13.7145 95.813 100
mean(var) 8.046 8.777 9.51974 8.778 9.1430 31.084 100
mean.default(obj) 6.217 7.314 9.17234 7.680 8.0460 84.111 100