回答:
例えば、
package main
func main() {
mymap := make(map[int]string)
keys := make([]int, 0, len(mymap))
for k := range mymap {
keys = append(keys, k)
}
}
Goで効率を上げるには、メモリ割り当てを最小限に抑えることが重要です。
mymap
ローカル変数ではない(したがって拡大/縮小される可能性がある)場合、これが唯一の適切な解決策であることに注意してください。これによりmymap
、keys
とfor
ループの初期化の間の変更のサイズが大きくなっても、境界の問題。
これは古い質問ですが、これが私の2セントです。PeterSOの答えは少し簡潔ですが、効率はやや劣ります。あなたはすでにそれがどれほど大きくなるか知っているので、追加を使う必要すらありません:
keys := make([]int, len(mymap))
i := 0
for k := range mymap {
keys[i] = k
i++
}
ほとんどの場合、ほとんど違いはありませんが、それほど効果はありません。私のテストでは(1,000,000のランダムなint64
キーを持つマップを使用し、各メソッドでキーの配列を10回生成しています)、追加を使用するよりも、配列のメンバーを直接割り当てる方が20%高速です。
容量を設定すると再割り当てがなくなりますが、追加では、追加ごとに容量に達しているかどうかを確認するために、追加の作業を行う必要があります。
for i, k := range mymap{
。そうすればあなたはi ++を必要としませんか?
i, k := range mymap
、i
キーとk
なり、マップ内のそれらのキーに対応する値になります。これは、実際にはキーのスライスを入力するのに役立ちません。
また、「reflect」パッケージから、structの[]Value
メソッドによってタイプ付きのキーの配列を取得することもできます。MapKeys
Value
package main
import (
"fmt"
"reflect"
)
func main() {
abc := map[string]int{
"a": 1,
"b": 2,
"c": 3,
}
keys := reflect.ValueOf(abc).MapKeys()
fmt.Println(keys) // [a b c]
}
[]string
ますか?
これを行うより良い方法は、使用することappend
です:
keys = []int{}
for k := range mymap {
keys = append(keys, k)
}
それ以外では、あなたは運が悪いのです。Goはあまり表現力のある言語ではありません。
keys = make([]int, 0, len(mymap))
ことは割り当てを取り除くでしょうが、私はそれがまだ遅くなることを期待しています。
他の回答で説明されている3つの方法について、大まかなベンチマークを作成しました。
明らかに、キーをプルする前にスライスを事前に割り当てる方がappend
ing よりも高速ですが、驚くべきことに、reflect.ValueOf(m).MapKeys()
メソッドは後者よりも大幅に遅くなります。
❯ go run scratch.go
populating
filling 100000000 slots
done in 56.630774791s
running prealloc
took: 9.989049786s
running append
took: 18.948676741s
running reflect
took: 25.50070649s
コードは次のとおりです:https : //play.golang.org/p/Z8O6a2jyfTH (プレイグラウンドで実行すると、時間がかかりすぎると主張して中止されるため、ローカルで実行します。)
keysAppend
関数では、keys
配列の容量をで設定できますmake([]uint64, 0, len(m))
。これにより、関数のパフォーマンスが劇的に変わりました。
訪問 https://play.golang.org/p/dx6PTtuBXQW
package main
import (
"fmt"
"sort"
)
func main() {
mapEg := map[string]string{"c":"a","a":"c","b":"b"}
keys := make([]string, 0, len(mapEg))
for k := range mapEg {
keys = append(keys, k)
}
sort.Strings(keys)
fmt.Println(keys)
}