R性能优化
原程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 
  | CaiAnalyseEiMac <- function(x) {                                    x$aid <- substr(x$aid, 5, 100)   n <- length(x$aid)   aid.lst <- unique(x$aid)               tmp.lst <- list()   mac.unique <- unique(x$mac)   for (mac in mac.unique) {     tmp.lst[[mac]] <- c()   }         for (i in 1:n) {     tmp.lst[[x$mac[i]]] <- c(tmp.lst[[x$mac[i]]], x$ei[i])   }         tmp.lst <- lapply(tmp.lst, FUN=function(x){return(length(unique(x)))})    } 
  | 
 
因为数据量比较大,在工作的机器上跑的时间超过半小时。。。。主要原因有两个:
- copy-on-change,这是R的机制,循环里有大量的修改list操作;
 
- R的循环效率比较低
 
后来发现tapply函数可以达到目的,主要代码如下:
1 
  | tmp.lst <- tapply(x$mac, x$ei, function(x)length(unique(x))) 
  | 
 
非常的简洁,而且时间消耗就几秒而已。