R:使用class属性列出元素的赋值

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

我在S3和S4类的上下文中进行了一些评测,并观察到以下内容:

与对应的普通列表上的相同操作相比,对S3对象元素的简单值赋值要慢2-3倍

在我看来,S3类是一个带有附加属性的列表,元素只是一个数字。那么,哪些机制会消耗额外的时间呢

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