这里是当使用的向量长度为 100 时三种方法的执行速度比较。最快的是 tcrossprod,x%*%t(y) 需要多 17%,outer(x,y) 需要多 45%(中位数时间)。
在表中,neval 是评估函数以获得基准分数的次数。
> x <- runif(100,0,100)
> y <- runif(100,0,100)
> microbenchmark(tcrossprod(x,y), x%*%t(y), outer(x,y), times=5000)
Unit: microseconds
expr min lq mean median uq max neval
tcrossprod(x, y) 11.404 16.6140 50.42392 17.7300 18.7555 5590.103 5000
x %*% t(y) 13.878 19.4315 48.80170 20.5405 21.7310 4459.517 5000
outer(x, y) 19.238 24.0810 72.05250 25.3595 26.8920 89861.855 5000
要得到下图,有
library("ggplot2")
bench <- microbenchmark(tcrossprod(x,y), x%*%t(y), outer(x,y), times=5000)
autplot(bench)
编辑:性能取决于x 和y 的大小,当然还有运行代码的机器。我最初使用长度为 100 的向量进行基准测试,因为这就是 Masi 所要求的。但是,对于较大的向量,这三种方法的性能似乎非常相似。对于长度为 1000 的向量,在我的机器上,这三种方法的中值时间相差在 5% 以内。
> x <- runif(1000)
> y <- runif(1000)
> microbenchmark(tcrossprod(x,y),x%*%t(y),outer(x,y),times=2000)
Unit: milliseconds
expr min lq mean median uq max neval
tcrossprod(x, y) 1.870282 2.030541 4.721175 2.916133 4.482346 75.77459 2000
x %*% t(y) 1.861947 2.067908 4.921061 3.067670 4.527197 105.60500 2000
outer(x, y) 1.886348 2.078958 5.114886 3.033927 4.556067 93.93450 2000