“*應用”家庭真的沒有矢量化嗎?所以我們習慣于對每一個R的新用戶說apply不是矢量化的,看看帕特里克·伯恩斯r地獄第4圈“它說(我引述):一個常見的反射是在應用程序家族中使用一個函數(shù)。這不是 矢量化,是循環(huán)隱藏。..Apply函數(shù)的定義中有一個for循環(huán)。lApplication函數(shù)掩埋循環(huán),但執(zhí)行時間往往與顯式for循環(huán)大致相等。實際上,快速查看一下apply源代碼顯示了循環(huán):grep("for", capture.output(getAnywhere("apply")), value = TRUE)## [1] " for (i in 1L:d2) {" " else for (i in 1L:d2) {"好的,但是看看lapply或vapply實際上展示了一幅完全不同的畫面:lapply## function (X, FUN, ...) ## {## FUN <- match.fun(FUN)## if (!is.vector(X) || is.object(X)) ## X <- as.list(X)## .Internal(lapply(X, FUN))## }## <bytecode: 0x000000000284b618>## <environment: namespace:base>所以很明顯沒有Rfor循環(huán)隱藏在那里,而是調(diào)用內(nèi)部C編寫函數(shù)。快速瀏覽兔子 孔洞顯示了幾乎相同的圖片另外,讓我們把colMeans函數(shù),它從未被指責沒有被傳送。colMeans# function (x, na.rm = FALSE, dims = 1L) # {# if (is.data.frame(x)) # x <- as.matrix(x)# if (!is.array(x) || length(dn <- dim(x)) < 2L) # stop("'x' must be an array of at least two dimensions")# if (dims < 1L || dims > length(dn) - 1L) # stop("invalid 'dims'")# n <- prod(dn[1L:dims])# dn <- dn[-(1L:dims)]# z <- if (is.complex(x)) # .Internal(colMeans(Re(x), n, prod(dn), na.rm)) + (0+1i) * # .Internal(colMeans(Im(x), n, prod(dn), na.rm))# else .Internal(colMeans(x, n, prod(dn), na.rm))# if (length(dn) > 1L) {# dim(z) <- dn# dimnames(z) <- dimnames(x)[-(1L:dims)]# }# else names(z) <- dimnames(x)[[dims + 1]]# z# }# <bytecode: 0x0000000008f89d20># <environment: namespace:base>哈?它也只是打電話.Internal(colMeans(...我們也可以在兔洞..所以這和.Internal(lapply(..?事實上,一個快速的基準測試顯示sapply表現(xiàn)不遜于colMeans比for用于大數(shù)據(jù)集的循環(huán)。m <- as.data.frame(matrix(1:1e7, ncol = 1e5))system.time(colMeans(m))# user system elapsed # 1.69 0.03 1.73 system.time(sapply(m, mean))# user system elapsed # 1.50 0.03 1.60 system.time(apply(m, 2, mean))# user system elapsed # 3.84 0.03 3.90 system.time(for(i in 1:ncol(m)) mean(m[, i]))# user system elapsed # 13.78 0.01 13.93換句話說,這么說對嗎?lapply和vapply 實際上是矢量化的(與apply這是for循環(huán),它也調(diào)用lapply帕特里克·伯恩斯到底想說什么?
3 回答

青春有我
TA貢獻1784條經(jīng)驗 獲得超8個贊
means <- numeric(length(mtcars))for (i in seq_along(mtcars)) { means[i] <- mean(mtcars[[i]])}sds <- numeric(length(mtcars))for (i in seq_along(mtcars)) { sds[i] <- sd(mtcars[[i]])}
means <- vapply(mtcars, mean, numeric(1))sds <- vapply(mtcars, sd, numeric(1))
- 3 回答
- 0 關注
- 550 瀏覽
添加回答
舉報
0/150
提交
取消