Я начал полагать, что кадры данных не имеют преимуществ по сравнению с матрицами, за исключением нотации. Тем не менее, я заметил эту странность при запуске 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
Результаты синхронизации расходятся еще более существенно по мере увеличения количества строк. Итак, в этом вопросе есть две части.
-
Почему это медленнее для матрицы? Кажется более быстрым преобразовать в кадр данных, запустить
unique
, а затем преобразовать обратно. -
Есть ли причина не просто переносить
unique
вmyUnique
, что делает преобразования в части # 1?
Примечание 1. Учитывая, что матрица является атомарной, кажется, что unique
должно быть быстрее для матрицы, а не медленнее. Будучи способным выполнять итерацию по фиксированному размеру, непрерывные блоки памяти обычно должны быть быстрее, чем работать над отдельными блоками связанных списков (я предполагаю, что как реализованы кадры данных...).
Примечание 2. Как показывает производительность data.table
, запуск unique
в кадре данных или в матрице - сравнительно плохая идея - см. ответ Мэтью Доула и комментарии относительно относительных таймингов. Я переместил много объектов в таблицы данных, и эта производительность - еще одна причина для этого. Поэтому, хотя пользователи должны хорошо обслуживать прием таблиц данных, для педагогических/общественных причин я оставлю открытым вопрос о том, почему это занимает больше времени на матричных объектах. Ответы ниже, где идет время, и как еще мы можем повысить производительность (т.е. Таблицы данных). Ответ на вопрос, почему близок - код можно найти через unique.data.frame
и unique.matrix
.:) Английское объяснение того, что он делает и почему все, чего не хватает.