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)))
|
非常的简洁,而且时间消耗就几秒而已。