Efficient way to remove names of vector elements
Sometimes you must remove names of elements within a vector. The most classic way to do is to use unname() function. However, the use of as.numeric() or as.character() is more efficient if you know the content of the vector. In conclusion, to remove names, it is 5 times more rapid to use as.integer(), as.character(), as.numeric() or as.logical().
i <- c(Pi=pi)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.171 0.002 0.174
system.time(for (j in 1:100000) k <- as.numeric(i))
utilisateur système écoulé
0.030 0.000 0.029
i <- c(Pi=3)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.169 0.003 0.174
system.time(for (j in 1:100000) k <- as.integer(i))
utilisateur système écoulé
0.028 0.000 0.028
i <- c(Pi="pi")
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.183 0.002 0.185
system.time(for (j in 1:100000) k <- as.character(i))
utilisateur système écoulé
0.03 0.00 0.03
i <- c(B=TRUE)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.157 0.002 0.159
system.time(for (j in 1:100000) k <- as.logical(i))
utilisateur système écoulé
0.035 0.001 0.034
i <- c(Pi=pi)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.171 0.002 0.174
system.time(for (j in 1:100000) k <- as.numeric(i))
utilisateur système écoulé
0.030 0.000 0.029
i <- c(Pi=3)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.169 0.003 0.174
system.time(for (j in 1:100000) k <- as.integer(i))
utilisateur système écoulé
0.028 0.000 0.028
i <- c(Pi="pi")
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.183 0.002 0.185
system.time(for (j in 1:100000) k <- as.character(i))
utilisateur système écoulé
0.03 0.00 0.03
i <- c(B=TRUE)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur système écoulé
0.157 0.002 0.159
system.time(for (j in 1:100000) k <- as.logical(i))
utilisateur système écoulé
0.035 0.001 0.034
The situation is worst in R 4.2:
> system.time(for (j in 1:100000) {i <- c(Pi=pi); attributes(i)$names <- NULL})
utilisateur système écoulé
0.069 0.001 0.070
> system.time(for (j in 1:100000) {i <- c(Pi=pi); i <- as.numeric(i)})
utilisateur système écoulé
0.044 0.001 0.044
> system.time(for (j in 1:100000) {i <- c(Pi=pi); i <- unname(i)})
utilisateur système écoulé
0.275 0.003 0.279
> 0.279/0.044
[1] 6.34
unname() is 6 times slower than as.numeric()
If a vector is used, this is no more true:
> i <- rep(pi, 2000); names(i) <- paste0("P", 1:2000)
> system.time(for (j in 1:100000) {k <- i; attributes(k)$names <- NULL})
utilisateur système écoulé
0.574 0.090 0.663
> system.time(for (j in 1:100000) {k <- i; k <- unname(k)})
utilisateur système écoulé
0.224 0.000 0.225
> system.time(for (j in 1:100000) {k <- i; k <- as.numeric(k)})
utilisateur système écoulé
0.943 0.222 1.168
> system.time(for (j in 1:100000) {k <- i; k <- as.vector(k)})
utilisateur système écoulé
1.071 0.202 1.274
Commentaires
Enregistrer un commentaire