是colMeans(),colSums()。。。在R中也并行化了吗?

是colMeans(),colSums()。。。在R中也并行化了吗?,c,r,performance,parallel-processing,C,R,Performance,Parallel Processing,我们知道,使用像colMeans(),colSums()这样的函数要比使用apply()的等价函数快得多,因为这是预编译的(在C,C++) 这些函数在这些语言中是否也自动并行化 也许并行化的开销并没有真正意义,因为它只是一个非常简单的函数,对吗?但是,对于非常大的矩阵,它还是有意义的?在R中没有自动并行化的功能,但是这些精确的函数存在于带有并行参数的Rfast包中。即使没有并行化,Rfast实现也更好 x = matrix(rnorm(1000*100),ncol=100) microbenc

我们知道,使用像
colMeans()
colSums()
这样的函数要比使用
apply()
的等价函数快得多,因为这是预编译的(在
C
C++

这些函数在这些语言中是否也自动并行化


也许并行化的开销并没有真正意义,因为它只是一个非常简单的函数,对吗?但是,对于非常大的矩阵,它还是有意义的?

在R中没有自动并行化的功能,但是这些精确的函数存在于带有并行参数的
Rfast
包中。

即使没有并行化,Rfast实现也更好

x = matrix(rnorm(1000*100),ncol=100)

microbenchmark::microbenchmark(.colSums(x,1000,100), colSums(x),Rfast::colsums(x,parallel=0),times=1000)
Unit: microseconds
                          expr     min      lq     mean  median      uq     max    neval
         .colSums(x, 1000, 100) 124.870 125.725 127.28580 125.726 126.153 301.911  1000
                     colSums(x) 132.567 133.423 136.30507 134.705 135.134 282.668  1000
Rfast::colsums(x, parallel = 0)  79.541  80.824  84.00742  81.252  82.107 307.470  1000
更大的矩阵使并行化相关(来自2核笔记本电脑的基准测试)


如果在控制台中键入
colMeans
(没有
()
),您将看到它的R代码。实际工作在启动
的两个函数调用中进行(colMeans
,这清楚地表明正在调用内置于R解释器中的已编译C函数。由于R是开源的,您可以根据需要查找该函数的代码。将这些函数并行化是否有意义?@D1X,如果您的维度太高。请注意,还有
base::.ColSums()
的开销小于
base::colSums()
@HenrikB,正如您在更新的基准测试中所看到的,base::.colSums()和base::colSums()之间的开销差异与Rfast计算相同结果所需的时间相比微不足道
x = matrix(rnorm(1000*1000),ncol=1000)

microbenchmark::microbenchmark(.colSums(x,1000,1000), colSums(x),Rfast::colsums(x,parallel=0),
    Rfast::colsums(x,parallel=1),times=1000)
Unit: microseconds
                           expr      min       lq      mean    median        uq      max  neval
        .colSums(x, 1000, 1000) 1313.268 1336.3600 1366.5152 1344.486 1355.1760 2468.310  1000
                     colSums(x) 1350.473 1366.2950 1401.0574 1374.420 1386.8210 2826.241  1000
Rfast::colsums(x, parallel = 0)  755.205  769.7440  801.5617  779.152  796.6850 1796.068  1000
Rfast::colsums(x, parallel = 1)  604.249  637.8185  680.3327  651.289  674.1675 1808.042  1000

x = matrix(rnorm(100000*100),ncol=100)

microbenchmark::microbenchmark(.colSums(x,100000,100), colSums(x),Rfast::colsums(x,parallel=0),
    Rfast::colsums(x,parallel=1),times=1000)

 Unit: milliseconds
                            expr       min        lq      mean    median        uq     max    neval
         .colSums(x, 1e+05, 100) 12.910733 12.971671 13.124897 13.011441 13.087346 26.914502  1000
                      colSums(x) 12.944944 13.012511 13.142074 13.058268 13.128400 14.879138  1000
 Rfast::colsums(x, parallel = 0)  6.988414  7.009796  7.165310  7.068810  7.154765 16.826589  1000
 Rfast::colsums(x, parallel = 1)  4.061679  4.251977  4.373995  4.296451  4.385827  7.610196  1000