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
나는 절대적으로 내 행렬 요소를 읽을 행 이름을 사용해야합니다. 공연을 어떻게 개선 할 수 있습니까?
UPDATE
내가 제프리 응답 및 일부의 벤치 마크 결과를 추가(). 나는 아무 생각이 왜 그러나 일부()가 훨씬 더 읽기 전용 공연 ([[]] 할당을 허용, 일부는()하지 않습니다) :
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
는 왜 이런 일이 그렇게 자주가? 왜 당신은 아마, 당신이 당신의 알고리즘을 다시 생각해야 하는가? rownames에 의해 반복적으로 행렬 요소에 액세스해야 할 중요한 것은이 같은 부분 집합해야합니까 왜 당신을 위해 제한?인가? – Roland
'?. subset '에서 :'메서드 디스패치가 발생하지 않는 것을 제외하고'. 그래서 더 빠릅니다. – Roland