WedX - журнал о программировании и компьютерных науках

Почему нотация data.table для выбора столбца влияет на скорость

Кажется, что есть разница в скорости в зависимости от того, как вы указываете столбцы, которые будут выбраны из таблицы данных: x[, .(var)] против x[, c('var')]. Причина может быть совершенно очевидной, однако на странице справки обозначения .(), list() и c() кажутся взаимозаменяемыми. Я работаю с довольно большими наборами данных, поэтому для меня это немного важно :-)

Пример (порядок вызова не влияет на скорость):

x <- as.data.table(as.character(rnorm(20000000,1,0.5)))
setkey(x, V1)

tic(); x[, .(V1)]; toc()
25.08 sec elapsed


tic(); x[, c('V1')]; toc()
0.28 sec elapsed

tic(); x[, 1]; toc()
0.02 sec elapsed

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] tictoc_1.0        data.table_1.12.8

loaded via a namespace (and not attached):
[1] compiler_3.6.1  tools_3.6.1     lifecycle_0.2.0 rlang_0.4.6  
26.05.2020

  • если вы хотите извлечь один столбец, вы можете использовать либо x[["V1"]], либо x$V1 26.05.2020
  • но они вернут вектор, в то время как упомянутые способы вернут один столбец data.table 26.05.2020
  • существуют накладные расходы при создании data.table, и некоторые участники/авторы пакетов пытаются уменьшить накладные расходы. Почему пользователь хочет создать один столбец data.table? то есть что он собирается делать дальше с одним столбцом data.table? Зачем нужно копировать столбец заново? 26.05.2020
  • Спасибо за чтение! @ chinsoon12: вопрос не в том, как извлекать столбцы и почему. Это вопрос о том, почему существует большая разница в производительности между нотациями (где нотация, указанная в чит-шите, очень медленная с большими наборами данных). Надеюсь смысл есть.. 26.05.2020
  • @ user9439449 вы можете прочитать слайды, сообщения, статьи и комментарии Мэтта Доула в начале. Он был разработан определенным образом, чтобы исключить некоторые ненужные вещи, чтобы сделать его быстрым. 26.05.2020
  • Привет @ user9439449, спасибо за ваш вопрос, теперь это отчет об ошибке здесь: github.com/Rdatatable /data.table/issues/4498 Пожалуйста, добавьте сюда свое имя, если хотите, чтобы вас цитировали помимо user9439449 :) 27.05.2020

Ответы:


1

Вы обнаружили ошибку (ошибка зарегистрирована здесь) — data.table пытается определить, является ли вывод [] ключевым; для этого он запускает внутреннюю функцию is.sorted. Это очень медленно для огромной таблицы уникальных строк.

К счастью, мы можем провести статический анализ и понять, что ваша выходная таблица на самом деле содержит ключи — подмножества нет, а ключевой столбец (V1) не изменился. Следовательно, порядок сортировки не может измениться, и ваш вывод также будет отсортирован по V1.

Эта логика встроена в PR для решения этой проблемы — вы можете протестируйте его с помощью remotes::install_github('Rdatatable/data.table@fix_sorting_on_sorted') с оговоркой, что это передовая версия пакета, или вы можете подождать, пока он не будет объединен с мастером, или пока новая версия не будет выпущена в CRAN.

А пока вот обходной путь:

setkey(x, NULL)
system.time(x[ , .(V1)])
#    user  system elapsed 
#   0.120   0.087   0.213

Конечно, это блокирует последующую обработку от распознавания того, что ваши данные отсортированы и их эффективность...

В этом случае (!и только в этом случае -- используйте с осторожностью!!!) -- где вы сами уверены, что данные уже отсортированы по V1 -- вы можете мгновенно восстановить ключ с помощью:

setattr(x, 'sorted', 'V1')

В целом, есть небольшие различия между выбором с помощью [, [[, $ и т. д. [, как правило, будет самым медленным, поскольку мы проводим много «статического анализа запросов», чтобы помочь повысить эффективность вашего кода, что связано с затратами на производительность. который, мы надеемся, почти каждый раз будет небольшим. Всякий раз, когда эта стоимость не мала, она должна быть ошибкой. Также активно ведется некоторая работа, чтобы попытаться предложить ярлыки для снижения этих накладных расходов, см., например, это пиар

26.05.2020
  • Спасибо за всю вашу работу по этому (и другим вопросам) - это очень ценно! 28.05.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]