Подтвердить что ты не робот

R: Почему подход [[]] для подмножества списка быстрее, чем использование $?

Я работал над несколькими проектами, которые потребовали от меня сделать множество подмножеств в списке и, в то время как код профилирования я понял, что подход [[ "nameHere" ]] к подмножествам списков обычно быстрее, чем объект $nameHere подход.

В качестве примера, если мы создадим список с именованными компонентами:

a.long.list <- as.list(rep(1:1000))
names(a.long.list) <- paste0("something",1:1000)

Почему это:

system.time (
for (i in 1:10000) {
    a.long.list[["something997"]]
}
)


user  system elapsed 
0.15    0.00    0.16 

быстрее этого:

system.time (
    for (i in 1:10000) {
        a.long.list$something997
    }
)

user  system elapsed 
0.23    0.00    0.23 

Мой вопрос: просто ли это поведение истинно универсально, и я должен избегать подмножества $, где это возможно, или самый эффективный выбор зависит от некоторых других факторов?

4b9b3361

Ответ 1

Функция [[ сначала проходит через все элементы, пытающиеся точно совместить, а затем пытается выполнить частичное совпадение. Функция $ пробует как точное, так и частичное совпадение для каждого элемента по очереди. Если вы выполните:

system.time (
    for (i in 1:10000) {
     a.long.list[["something9973", exact=FALSE]]
     }
)

Например, вы выполняете частичное совпадение, в котором нет точного соответствия, вы обнаружите, что $ на самом деле все еще немного быстрее.