Похоже, что Уэс, возможно, обнаружил известную проблему, data.table
когда число уникальных строк ( уровней ) велико: 10000.
Показывает ли Rprof()
большую часть времени, проведенного в вызове sortedmatch(levels(i[[lc]]), levels(x[[rc]])
? Это не само объединение (алгоритм), а предварительный шаг.
В последнее время предпринимаются попытки разрешить использование символьных столбцов в ключах, что должно решить эту проблему путем более тесной интеграции с собственной глобальной хеш-таблицей строк R. Некоторые результаты тестов уже сообщаются, test.data.table()
но этот код еще не подключен для замены уровней на соответствующие уровни.
Являются ли панды быстрее, чем data.table
обычные целочисленные столбцы? Это должно быть способом изолировать сам алгоритм от факторных проблем.
Кроме того, data.table
имеет в виду временные ряды . Два аспекта к этому: i) ключи, упорядоченные по нескольким столбцам, такие как (id, datetime) ii) быстрое преобладание join ( roll=TRUE
) или последнее перенесенное наблюдение.
Мне нужно некоторое время, чтобы подтвердить это, поскольку я впервые увидел сравнение с data.table
представленным.
ОБНОВЛЕНИЕ data.table v1.8.0 выпущено в июле 2012
- Внутренняя функция sortedmatch () удалена и заменена на chmatch () при сопоставлении уровней i с уровнями x для столбцов типа 'factor'. Этот предварительный шаг вызывал (известное) значительное замедление, когда число уровней столбца факторов было большим (например,> 10000). Усиление в тестах объединения четырех таких столбцов, как продемонстрировал Уэс МакКинни (автор пакета Python Pandas). Например, соответствие 1 миллиону строк, из которых 600 000 уникальны, теперь уменьшено с 16 до 0,5.
Также в этом выпуске было:
символьные столбцы теперь разрешены в ключах и предпочтительнее фактора. data.table () и setkey () больше не приводят символ к фактору. Факторы все еще поддерживаются. Реализует FR # 1493, FR # 1224 и (частично) FR # 951.
Новые функции chmatch () и% chin%, более быстрые версии match () и% in% для векторов символов. Используется внутренний строковый кеш R (хеш-таблица не создается). Они примерно в 4 раза быстрее, чем match () на примере в? Chmatch.
По состоянию на сентябрь 2013 года data.table на CRAN v1.8.10, а мы работаем на v1.9.0. NEWS обновляется в прямом эфире.
Но, как я написал изначально, выше:
data.table
имеет в виду временные ряды . Два аспекта к этому: i) ключи, упорядоченные по нескольким столбцам, такие как (id, datetime) ii) быстрое преобладание join ( roll=TRUE
) или последнее перенесенное наблюдение.
Таким образом, Pandas equi соединение двух столбцов символов, вероятно, все еще быстрее, чем data.table. Так как он звучит так, как будто он объединяет две колонки. data.table не хеширует ключ, потому что имеет в виду преобладающие упорядоченные объединения. «Ключ» в data.table - это буквально просто порядок сортировки (аналогично кластерному индексу в SQL; т. Е. Так упорядочиваются данные в оперативной памяти). В список стоит добавить вторичные ключи, например.
Таким образом, явная разница в скорости, выделенная этим конкретным двухсимвольным тестом с более чем 10000 уникальных строк, не должна быть такой плохой, поскольку известная проблема была исправлена.
data.table
просто наследуется отdata.frame
, но он опирается на C-код под капотом.