【问题标题】:Time to get elements from a matrix object是时候从矩阵对象中获取元素了
【发布时间】:2013-06-11 11:53:21
【问题描述】:

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

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() 的基准测试结果。我不知道为什么但是 subset() 具有更好的只读性能([[]] 允许分配,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

【问题讨论】:

  • 为什么这对您有限制?为什么您需要如此频繁地进行子集化,这很重要?为什么需要通过行名重复访问矩阵元素?也许,你应该重新考虑你的算法?
  • 来自?.subsetexcept that methods dispatch does not take place。这就是它更快的原因。

标签: r matrix microbenchmark


【解决方案1】:

你可以使用 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

【讨论】:

  • 仍然慢了将近 20 倍。矩阵不是使用哈希结构从行名中获取元素单元格索引吗?
  • @RobertKubrick 它动态构建哈希,并且仅在比线性搜索更有效时,即当您使用许多名称进行子集时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多