R語言的精度和時間效率比較(簡單版)


  • R語言的最大數值

  在R語言里面,所能計算的最大數值可以用下面的方法獲得:

  

###R可計算最大數值
.Machine

在編程的時候注意不要超過這個數值。當然,普通情況下也不可能超過的。

  • R語言的最大精度

  R語言的舍入誤差要比python好不少,但是也還是有的。

  

###最小非零整數
2^-1074
###最大數
2^1023
###機器誤差
2^-52 + 1 - 1
2^-53 + 1 - 1

###比較兩個數字
all.equal(2^-12 + 1,2^-13 + 1,tolerance = 1e-7)

  上面所謂的機器誤差就是不可避免的最小誤差,在做運算時會被舍棄。至於在什么情況下舍棄,取決於兩個數之間的誤差是均方根,系統默認的均方根是10^-8,小於這個值的時候R就會默認它們相等。使用all.equal函數可以自己設定均方根的閾值,即tolerance.

  • R語言的時間消耗
###創建向量會更浪費時間
n <- 1e6
x <- rep(0,n)
system.time(for(i in 1:n) x[i] <- i^2)
x <- c()
system.time(for(i in 1:n) x[i] <- i^2)

    可以看到時間差距還是很大的。

###矩陣的列求和
###全部使用循環,不使用sum函數
Bmatrix <- matrix(1:1e6,nrow = 1000)
colsums <- rep(NA, ncol(Bmatrix))
system.time(for(i in 1:ncol(Bmatrix)){
  s <- 0
  for(j in 1:1000){
    s <- s + Bmatrix[j,i]
  }
  colsums[i] <- s
})
###使用apply和sum
system.time(colsums <- apply(Bmatrix,2,sum))
###使用sum和循環
system.time(for(i in 1:ncol(Bmatrix)){
  colsums[i] <- sum(Bmatrix[,i])
})
###使用系統函數
system.time(colsums <- colSums(Bmatrix))

  上面的結果隨着電腦的不同應該是不一樣的,但是整體上來看肯定使用系統函數是最快的,其次是用sum函數,但是for和apply的效率是一樣的,因為apply本來就是做的循環運算:

###apply里面的for結構/膜拜大佬的代碼
ans <- vector("list", d2)
    if (length(d.call) < 2L) {
        if (length(dn.call)) 
            dimnames(newX) <- c(dn.call, list(NULL))
        for (i in 1L:d2) {
            tmp <- forceAndCall(1, FUN, newX[, i], ...)
            if (!is.null(tmp)) 
                ans[[i]] <- tmp
        }
    }
    else for (i in 1L:d2) {
        tmp <- forceAndCall(1, FUN, array(newX[, i], d.call, 
            dn.call), ...)
        if (!is.null(tmp)) 
            ans[[i]] <- tmp
    }

  

###colSums的函數結構
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[id <- seq_len(dims)])
    dn <- dn[-id]
    z <- if (is.complex(x)) 
        .Internal(colSums(Re(x), n, prod(dn), na.rm)) + (0+1i) * 
            .Internal(colSums(Im(x), n, prod(dn), na.rm))
    else .Internal(colSums(x, n, prod(dn), na.rm))
    if (length(dn) > 1L) {
        dim(z) <- dn
        dimnames(z) <- dimnames(x)[-id]
    }
    else names(z) <- dimnames(x)[[dims + 1L]]
    z
}

  這個代碼。。。里面還調用的colSums,有沒有童鞋可以幫我解釋一下這是為啥。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM