¿Hay alguna forma más simple / mejor de obtener una porción de claves de un mapa en Go?
Actualmente estoy iterando sobre el mapa y copiando las claves en un segmento:
i := 0
keys := make([]int, len(mymap))
for k := range mymap {
keys[i] = k
i++
}
Respuestas:
Por ejemplo,
Para ser eficiente en Go, es importante minimizar las asignaciones de memoria.
fuente
mymap
no es una variable local (y, por lo tanto, está sujeta a crecimiento / reducción), esta es la única solución adecuada: garantiza que si el tamaño de losmymap
cambios entre la inicialización dekeys
y elfor
bucle, no habrá ninguna salida. problemas de límites.Esta es una vieja pregunta, pero aquí están mis dos centavos. La respuesta de PeterSO es un poco más concisa, pero un poco menos eficiente. Ya sabes lo grande que será, así que ni siquiera necesitas usar append:
En la mayoría de las situaciones, probablemente no hará mucha diferencia, pero no es mucho más trabajo, y en mis pruebas (usando un mapa con 1,000,000
int64
claves aleatorias y luego generando la matriz de claves diez veces con cada método), se trataba de 20% más rápido para asignar miembros de la matriz directamente que para usar append.Si bien establecer la capacidad elimina las reasignaciones, append todavía tiene que hacer un trabajo adicional para verificar si ha alcanzado la capacidad en cada anexo.
fuente
for i, k := range mymap{
? De esa manera no necesitas el i ++?i, k := range mymap
, entoncesi
serán claves yk
serán valores correspondientes a esas claves en el mapa. En realidad, eso no te ayudará a llenar una porción de claves.También puede tomar una matriz de claves con tipo
[]Value
por métodoMapKeys
de estructuraValue
del paquete "reflect":fuente
[]string
?Una mejor manera de hacer esto sería usar
append
:Aparte de eso, no tienes suerte: Go no es un lenguaje muy expresivo.
fuente
keys = make([]int, 0, len(mymap))
se eliminarán las asignaciones, pero espero que aún sea más lento.Hice un punto de referencia incompleto sobre los tres métodos descritos en otras respuestas.
Obviamente, preasignar el segmento antes de tirar de las teclas es más rápido que
append
ing, pero sorprendentemente, elreflect.ValueOf(m).MapKeys()
método es significativamente más lento que el último:Aquí está el código: https://play.golang.org/p/Z8O6a2jyfTH (ejecutarlo en el patio de juegos aborta alegando que lleva demasiado tiempo, así que, bueno, ejecútelo localmente).
fuente
keysAppend
función, puede establecer la capacidad de lakeys
matriz conmake([]uint64, 0, len(m))
, lo que cambió drásticamente el rendimiento de esa función para mí.Visita https://play.golang.org/p/dx6PTtuBXQW
fuente