R 从矩阵对象获取元素的时间
与此类似,我运行了一个微基准,从一个大矩阵中读取单个元素。我惊讶地发现,使用行名称时性能会降低多少:R 从矩阵对象获取元素的时间,r,matrix,microbenchmark,R,Matrix,Microbenchmark,与此类似,我运行了一个微基准,从一个大矩阵中读取单个元素。我惊讶地发现,使用行名称时性能会降低多少: 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
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()不允许):
您可以使用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它会动态构造哈希,并且只有在比线性搜索更有效的情况下,即当您使用多个名称进行子集时,才会进行。为什么这对您来说是一个限制?为什么您需要如此频繁地使用这样的子集,以使尝试?为什么需要通过行名重复访问矩阵元素?也许,您应该重新考虑您的算法?从
?。子集:,除了方法分派不发生之外。
。这就是为什么它更快的原因。
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