4

与这个问题类似,我运行了一个微基准来从一个大矩阵中读取单个元素。我很惊讶地看到使用行名时性能会降低多少:

m = matrix(1, nrow=1000000, ncol=10)
rownames(m) = as.character(1:1000000)
microbenchmark(m["3450", 1], m[3450, 1], times=1000)
Unit: microseconds
         expr       min        lq      median          uq        max neval
 m["3450", 1] 176465.55 183443.369 185321.5540 185982.0840 522346.477  1000
 m[3450, 1]        3.19      3.445     10.7155     14.1545     29.897  1000

我绝对需要使用行名来读取我的矩阵元素。我怎样才能提高性能?

更新

我添加了来自 Geoffrey answer 和 subset() 的基准测试结果。我不知道为什么但是子集()具有更好的只读性能([[]] 允许分配,子集()不允许):

 microbenchmark(m["3450", 1], m[["3450", 1]], m[3450, 1], .subset(m, 1)["3450"], .subset(m, 1)[3450], times=1000)
Unit: microseconds
                  expr        min         lq      median          uq        max neval
          m["3450", 1] 176667.252 180197.435 181969.2900 185090.9155 254075.814  1000
        m[["3450", 1]]    144.732    145.341    151.1440    191.9960   1096.183  1000
            m[3450, 1]      2.900      3.290      4.4400      6.5025     22.391  1000
 .subset(m, 1)["3450"]      2.704      3.140      4.1285     14.8740     43.134  1000
   .subset(m, 1)[3450]      2.460      2.815      3.2680     13.0300     38.105  1000
4

1 回答 1

3

您可以使用 m[["3450, 1]]。'[[' 运算符仅选择一个元素(我相信第一个元素)然后返回它。'[' 用于选择多个元素。理想情况下,您首先不会将字符作为行名...

microbenchmark(m["3450", 1], m[["3450", 1]],m[3450, 1], times=1000)
Unit: nanoseconds
           expr      min       lq   median       uq       max neval
   m["3450", 1] 74898303 76755304 78038970 87569666 231740997  1000
 m[["3450", 1]]    30790    32657    48673    55671    241340  1000
     m[3450, 1]      623     1245     2800     6532     26125  1000
于 2013-06-11T12:42:23.260 回答