我注意到在 R 中从右到左以二次形式计算矩阵运算明显快于从左到右,具体取决于括号的放置方式。显然它们都执行相同的计算量。我想知道为什么会这样。这与内存分配有什么关系吗?
# A: 5000 * 5000
# B: 5000 * 2
A = matrix(runif(5000 * 5000), nrow = 5000)
B = matrix(rbinom(5000 * 2, size = 2, prob = 0.3), nrow = 5000)
microbenchmark((t(B) %*% A) %*% B, t(B) %*% (A %*% B), times = 100)
Run Code Online (Sandbox Code Playgroud)
这是会话信息:
R version 4.2.0 (2022-04-22)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Big Sur 11.4
Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics …Run Code Online (Sandbox Code Playgroud) 我正在将一些主要使用数字数据(即双打)的代码转换为整数,并做了一个快速的基准测试,看看我获得了多少效率.
令我惊讶的是它慢了......大约20%.我以为自己做错了什么,但是原始代码只是对中等大小的矢量进行了几次基本的算术运算,所以我知道不是那样的.也许我的环境搞砸了?我重新开始新鲜,同样的结果......整数效率较低.
这开始了一系列测试和潜入兔子洞.这是我的第一次测试.我们使用基数R总计一百万个元素sum.请注意,对于R版本3.5.0,时序有点不同,对于v 3.5.1,时序大致相同(仍然不是人们所期望的):
set.seed(123)
int1e6 <- sample(1:10, 1e6, TRUE)
dbl1e6 <- runif(1e6, 1, 10)
head(int1e6)
# [1] 5 3 6 8 6 2
class(int1e6)
# [1] "integer"
head(dbl1e6)
# [1] 5.060628 2.291397 2.992889 5.299649 5.217105 9.769613
class(dbl1e6)
#[1] "numeric"
mean(dbl1e6)
# [1] 5.502034
mean(int1e6)
# [1] 5.505185
## R 3.5.0
library(microbenchmark)
microbenchmark(intSum = sum(int1e6), dblSum = sum(dbl1e6), times = 1000)
Unit: microseconds
expr min lq mean median uq max neval
intSum 1033.677 1043.991 1147.9711 1111.438 …Run Code Online (Sandbox Code Playgroud)