Почему «уникальный» выполняется быстрее в кадре данных, чем матрица в R?

Я начал верить, что фреймы данных не имеют преимуществ перед матрицами, за исключением удобства записи. Однако я заметил эту странность при запуске unique для матриц и фреймов данных: похоже, он работает быстрее в фреймах данных.

a   = matrix(sample(2,10^6,replace = TRUE), ncol = 10)
b   = as.data.frame(a)

system.time({
    u1 = unique(a)
})
 user  system elapsed
1.840   0.000   1.846


system.time({
    u2 = unique(b)
})
 user  system elapsed
0.380   0.000   0.379

Результаты синхронизации расходятся еще более существенно, когда количество строк увеличивается. Итак, этот вопрос состоит из двух частей.

  1. Почему это медленнее для матрицы? Кажется, быстрее преобразовать во фрейм данных, запустить unique , а затем преобразовать обратно.

  2. Есть ли причина не просто обернуть unique в myUnique , который выполняет преобразования в части №1?


Примечание 1. Учитывая, что матрица является атомарной, она кажется, что unique должен быть быстрее для матрицы, а не медленнее. Возможность итерации по фиксированному размеру, непрерывные блоки памяти, как правило, должны быть быстрее, чем запуск по отдельным блокам связанных списков (я предполагаю, как реализованы фреймы данных ...).

Примечание 2. Как показывает производительность data.table , запуск unique для фрейма данных или матрицы является сравнительно плохой идеей - см. Ответ Мэтью Доула и комментарии для относительного времени. Я перенес много объектов в таблицы данных, и эта производительность - еще одна причина для этого. Поэтому, хотя пользователи должны иметь возможность принимать таблицы данных, по педагогическим / общественным причинам я пока оставлю открытым вопрос относительно , почему требует больше времени для матричных объектов. В ответах ниже адрес , где идет время, и , как еще мы можем повысить производительность (например, таблицы данных). Ответ на , почему под рукой - код можно найти через unique.data.frame и unique.matrix .:) Английское объяснение того, что он делает и почему всего этого не хватает.

26
задан Iterator 18 October 2011 в 18:34
поделиться