R语言的精度和时间效率比较(简单版)
- R语言的最大数值
在R语言里面,所能计算的最大数值可以用下面的方法获得:
###R可计算最大数值
.Machine
在编程的时候注意不要超过这个数值。当然,普通情况下也不可能超过的。
- R语言的最大精度
R语言的舍入误差要比python好不少,但是也还是有的。
1 2 3 4 5 6 7 8 9 10 | ###最小非零整数 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语言的时间消耗
1 2 3 4 5 6 | ###创建向量会更浪费时间 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) |
可以看到时间差距还是很大的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ###矩阵的列求和 ###全部使用循环,不使用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本来就是做的循环运算:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ###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 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ###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,有没有童鞋可以帮我解释一下这是为啥。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix