2013-06-11 2 views
4

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 
+2

는 왜 이런 일이 그렇게 자주가? 왜 당신은 아마, 당신이 당신의 알고리즘을 다시 생각해야 하는가? rownames에 의해 반복적으로 행렬 요소에 액세스해야 할 중요한 것은이 같은 부분 집합해야합니까 왜 당신을 위해 제한?인가? – Roland

+0

'?. subset '에서 :'메서드 디스패치가 발생하지 않는 것을 제외하고'. 그래서 더 빠릅니다. – Roland

답변

3
당신은 m의 [사용할 수

[ "3450, 1] ] [ '[['연산자는 하나의 요소 만 선택하고 첫 번째 요소를 선택하고 '['는 둘 이상의 요소를 선택하는 데 사용됩니다.] 처음에는 문자를 rownames로 사용하지 않는 것이 좋습니다. .

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 
+0

여전히 거의 20 배 더 느립니다. 해시 구조를 사용하는 행렬이 행 이름에서 요소 셀 인덱스를 키 지정하지 않았습니까? –

+0

@RobertKubrick 해시를 즉시 구성합니다. 선형 검색보다 효율적인 경우, 즉 여러 이름으로 하위 집합을 지정할 때만 가능합니다. – hadley

관련 문제