42 votes

R : Pourquoi l'approche [[ ]] pour le sous-ensemble d'une liste est-elle plus rapide que l'utilisation de $ ?

J'ai travaillé sur quelques projets qui m'ont demandé de faire beaucoup de sous-ensembles de listes et en profilant du code j'ai réalisé que l'approche object[["nameHere"]] pour sous-ensembler des listes était généralement plus rapide que l'approche object$nameHere.

Par exemple, si nous créons une liste avec des composants nommés :

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

Pourquoi ça ?

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

user  system elapsed 
0.15    0.00    0.16 

plus vite que ça :

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

user  system elapsed 
0.23    0.00    0.23 

Ma question est simplement de savoir si ce comportement est vrai universellement et si je dois éviter le sous-ensemble $ dans la mesure du possible ou si le choix le plus efficace dépend d'autres facteurs ?

9voto

Bojan Nikolic Points 551

Fonction [[ La première passe par tous les éléments en essayant de trouver une correspondance exacte, puis essaie de faire une correspondance partielle. Le site $ tente une correspondance exacte et partielle sur chaque élément à tour de rôle. Si vous exécutez :

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

c'est-à-dire que vous exécutez une correspondance partielle où il n'y a pas de correspondance exacte, vous trouverez que $ est en fait très légèrement plus rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X