R быстрый способ чтения значений из матрицы? - PullRequest
0 голосов
/ 20 июня 2019

Я хочу прочитать значения как можно быстрее из матрицы (или вектора).

Стандартный способ будет следующим:

# defining the matrix
x = matrix(runif(100), nrow=10)
# reading one value
x[2,3]

Я пытался использовать data.table с индексом, но он выглядит намного медленнее:

x2 = as.data.table(x)
x2$idx = 1:10
setkey(x2, idx)
x2

x[2,3]
x2[2,3, with=F]
# we verify it is the same value

microbenchmark(x[2,3], x2[2,3, with=F])
Unit: nanoseconds
               expr    min     lq     mean median     uq    max neval
            x[2, 3]    132    157    479.9    504    677   2811   100
 x2[2, 3, with = F] 181007 185055 200142.2 188007 197573 441153   100

Есть ли способ сделать быстрее, чем чтение базовой матрицы?

1 Ответ

0 голосов
/ 21 июня 2019

Нет, нет более быстрого способа чтения матрицы, чем matr[i, j].

  1. Если у вас есть вектор, извлечение эквивалентного элемента может быть немного быстрее.
  2. Если у вас есть data.table, выполните dt[['V3']][2].dt[2,3] очень медленный.
  3. Если у вас есть data.frame, выполните df[['V3']][2].

Ваш пример с 10 000 000 значений в 10 строках (т. Е. 1 000 000 столбцов)

Unit: nanoseconds
          expr        min         lq       mean     median         uq        max neval
      vect[22]        100        900       1380       1250       2000       2900    10

       x[2, 3]        100        200       1130       1500       1700       2300    10
       x[[22]]        600       1000       1620       1600       1700       4400    10

      dt[2, 3] 1120103100 1121659900 1132672490 1121957850 1123820200 1226030600    10
     dt[2, V3] 1183598600 1185074800 1204766740 1188306650 1220468900 1262510200    10
 dt[["V3"]][2]       8900      16800      32950      39850      43200      44400    10

      df[2, 3]    7851400    7867500    8753220    8730250    9547200   10022700    10
 df[["V3"]][2]       8100      11500      20830      16150      32700      36000    10

Ваш пример с 10 000 000 строками и 10 столбцами:

Unit: nanoseconds
          expr    min     lq   mean median     uq      max neval
      vect[22]    100    300    508    400    600     2000   100

       x[2, 3]    200    300    591    500    800     2600   100
       x[[22]]    200    500    727    600    900     1900   100

      dt[2, 3] 280800 288700 314736 295350 325200   509700   100
     dt[2, V3] 495700 505950 910938 522750 560700 37038500   100
 dt[["V3"]][2]   8200   9200  12048  11350  13100    23200   100

      df[2, 3]  20600  23100  29587  28700  32950    68100   100
 df[["V3"]][2]   7400   8300  11310  10500  12550    24100   100

Ваш пример с 100 строками:

Unit: nanoseconds
          expr    min     lq   mean median     uq    max neval
      vect[22]      0    300    416    300    500   1100   100

       x[2, 3]    100    300    542    450    800   1500   100
       x[[22]]    100    400    654    600    800   1400   100

      dt[2, 3] 256200 262000 270385 264850 268950 410100   100
     dt[2, V3] 432000 439750 457196 443900 462200 617900   100
 dt[["V3"]][2]   7800   8700  10965  10350  11400  23500   100

      df[2, 3]  16600  18450  23580  22600  27300  81800   100
 df[["V3"]][2]   7100   7850   9781   9400  10300  15100   100

Редактировать: Данные:

library(data.table)

set.seed(1)

vect <- runif(1E7)
x <- matrix(vect, ncol = 10)
df <- as.data.frame(x)
dt <- as.data.table(x)

vect[22];x[2,3];x[[22]];dt[2, 3]; df[2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...